Ada错误:引发了SYSTEM.ASSERTIONS.ASSERT_FAILURE:来自lexical_analyzers.ads:20的前提条件失败

时间:2014-11-28 03:15:22

标签: parsing ada preconditions gnat-gps

我在编程概念中所做的一些事情超出了我父亲的头脑,因为预计下一代将比上一代智能化。无论如何,我一直致力于一个我需要在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文件中指定我写的每个方法吗?我想是的,这就是语言的运作方式。你们有什么其他的想法,为什么我收到这个错误?

1 个答案:

答案 0 :(得分:2)

错误意味着它的含义:你有一个失败的先决条件。第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岁的老人帮助你。 (拿那个,扎克伯格。)