我错误地写了这个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类。
答案 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);
在这种情况下,你已经完成了两次;您已创建了本地Parser
和Lexical_Analyser
,而不是传递Parser
(及其包含的Lexical_Analyser
)。
这是你似乎在代码中的几个地方重复的模式。