我正在BNFC中编写一个编译器,它已经进入了一个阶段,它已经编译了一些东西,代码可以在我的设备上运行。但在发货之前,我希望我的编译器在用户尝试编译无效程序时返回正确的错误消息。
我发现野牛如何在stderr流上写错误,我能捕捉到它们。现在假设用户的代码没有语法错误,它只引用了一个未定义的变量,我能够在访问者中捕获这个,但我不知道行号是什么,怎么能我找到了行号?
答案 0 :(得分:0)
在野外,您可以使用变量@$
访问当前表达式的起始位置和结束位置,该变量包含一个包含成员first_column
,first_line
,last_column
的结构和last_line
。类似地,@1
等分别包含子表达式$ 1等的相同信息。
为了以后可以访问相同的信息,您需要将其写入您的ast。因此,在AST节点类型中添加一个字段以存储位置,然后在bison文件中创建节点时设置该字段。
答案 1 :(得分:0)
(以前的答案更丰富)但是在一些简单的解析器中,如果我们声明
%option yylineno
在flex中,并在yyerror中打印,
yyerror(char *s) {
fprintf(stderr,"ERROR (line %d):before '%s'\n-%s",yylineno, yytext,s);
}
有时它有帮助...