如何填写这大段代码中的列表?

时间:2014-11-28 21:35:06

标签: ada

我错误地写了这个Parser。我的教授说我不恰当地使用了令牌。问题是我正在尝试从空列表中访问令牌。我怎么可能用令牌填充列表,以确保程序分析令牌,以便埃菲尔代码可以执行。这就是我收到此错误的原因:

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

代码可以在这里找到:

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

错误来自lexical_analyzers.ads和parsers.adb类。

1 个答案:

答案 0 :(得分:1)

您的程序Parse开始

procedure parse(p: in out Parser; f: out feature) is
   tok: Token;
   lex: Lexical_Analyzer;
   var: Id;
   com: Compound;
begin

所以当你说

   get_next_token(lex, tok);

它使用lex?答案:您在声明中创建的空白。您应该使用p.lex

在接下来的一行中,您对get_id的来电未通过p

   var := get_id(tok);

get_id重复模式,

function get_id(tok: in Token) return Id is

   par: Parser;
   lex: Lexical_Analyzer;
   tok1: Token := tok;
   str: String := String(Tokens.get_lexeme(tok1));
begin
   get_next_token(lex, tok1);

在这种情况下,你已经完成了两次;您已创建了本地ParserLexical_Analyser,而不是传递Parser(及其包含的Lexical_Analyser)。

这是你似乎在代码中的几个地方重复的模式。