-3

我在《编程概念》中所做的一些事情超出了我父亲的想象,因为预计下一代会比上一代更聪明。无论如何,我一直在做一个需要在 12 月 2 日之前完成的项目。它相当复杂。它应该是一种称为 Eiffel 的基本语言的解析器和词法分析器。到目前为止,我已经在教授的网站和示例文件的帮助下修复了所有编译错误(我认为任何关于 Ada 的书籍都没有介绍如何创建解析器或词法分析器)。我构建了 exe,运行它,结果发现我收到如下错误:

raised SYSTEM.ASSERTIONS.ASSERT_FAILURE : failed precondition from lexical_analyzers.ads:20

在此 zip 文件中的 lexical_analyzers.ads 中的代码中指定:

https://drive.google.com/file/d/0B3ZPyNRv7C3heEN1cnU3dVFOZmM/view?usp=sharing

第 20 行,甚至可能是它上面的第 17 行,都出现了错误。这可能与我编写 parser.adb 文件的方式有关。这种语言的工作方式与 C 语言非常相似,因为您需要在编写主体文件之前编写一个规范文件,有时在我编写代码时来回切换。我是否还应该在 parser.ads 文件中指定我在 parser.adb 文件中编写的每个方法?我想是的,这就是语言的工作方式。你们对我为什么会收到此错误有任何其他想法吗?

4

1 回答 1

3

该错误几乎意味着它所说的:您有一个失败的先决条件。第 20 行的代码看起来像

procedure get_next_token (lex: in out Lexical_Analyzer; tok: out Token)
   with pre => more_tokens (lex);

more_tokens(lex)是前提。这意味着如果您调用get_next_token,则必须有更多令牌,否则前提条件将失败。

这意味着规范告诉程序的其余部分,“get_next_token除非您确定文件中有更多标记,否则不要调用”。因此,无论何时调用它,调用者都应该已经检查more_tokens(lex)过,如果没有,则采取适当的措施。不过,在parsers.adb. 这意味着要么

  • parsers.adb需要修改以确保它不会在get_next_token没有先检查的情况下调用(或者以其他方式知道还有更多);或者

  • 前提条件不应该存在,并且get_next_token需要重新定义,以便在没有更多标记时允许调用它,可能通过设置tok为指示“输入结束”的特殊标记。

请告诉你所有的同学,你必须有一个 53 岁的人来帮助你。(拿那个,扎克伯格。)

于 2014-11-28T04:51:09.540 回答