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

Ada 如何在这段大代码中填写列表?,ada,Ada,我写错了这个解析器。我的教授说我不恰当地使用代币。问题是我试图从一个空列表中访问令牌。我如何可能用令牌填充列表,以确保程序分析令牌,以便埃菲尔代码可以执行。这就是为什么我会出现这个错误: raised SYSTEM.ASSERTIONS.ASSERT_FAILURE : failed precondition from lexical_analyzers.ads:20 代码可在此处找到: 错误来自于lexical_analyzers.ads和parsers.adb类。您的过程Parse开始

我写错了这个解析器。我的教授说我不恰当地使用代币。问题是我试图从一个空列表中访问令牌。我如何可能用令牌填充列表,以确保程序分析令牌,以便埃菲尔代码可以执行。这就是为什么我会出现这个错误:

raised SYSTEM.ASSERTIONS.ASSERT_FAILURE : failed precondition from lexical_analyzers.ads:20
代码可在此处找到:


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

您的过程
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\u 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);
在这种情况下,您已经做了两次;您创建了一个本地
解析器
词法分析器
,而不是传入
解析器
(及其包含的
词法分析器


这是一种模式,您似乎在代码中的多个地方重复了这种模式。

您的问题实际上不适合更广泛的SO(从“帮助”中,“问题寻求调试帮助”(“此代码为什么不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现该问题所需的最短代码。”),并且很可能被视为关闭的候选者。因此,希望问题及其答案成为未来的资源:您很可能很快就会删除Google Drive存档,那么这个问题及其答案对任何人都有什么用呢?我编辑了我的代码,添加了您指定的p.lex内容,不幸的是,这并没有产生任何影响。我需要用p.lex方法定义一些东西。create_lexical_analyzer只使用文件名,我的类中没有这个文件名。这是我编辑过的代码。可以在parsers.adb类中看到更改:如果您没有注意到,我更新了答案(最后2段)。