如何在BNFC中进行适当的错误处理? (C ++,Flex,Bison)

时间:2015-02-10 11:33:12

标签: c++ bison flex-lexer bnfc

我正在BNFC中编写一个编译器,它已经进入了一个阶段,它已经编译了一些东西,代码可以在我的设备上运行。但在发货之前,我希望我的编译器在用户尝试编译无效程序时返回正确的错误消息。

我发现野牛如何在stderr流上写错误,我能捕捉到它们。现在假设用户的代码没有语法错误,它只引用了一个未定义的变量,我能够在访问者中捕获这个,但我不知道行号是什么,怎么能我找到了行号?

2 个答案:

答案 0 :(得分:0)

在野外,您可以使用变量@$访问当前表达式的起始位置和结束位置,该变量包含一个包含成员first_columnfirst_linelast_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);
}

有时它有帮助...