Bison:错误消息中包含的行号

时间:2014-03-14 14:24:17

标签: c++ bison yacc lex flex-lexer

好的,所以我想我的问题很明显。

我目前正在Bison中构建一个解析器,我想让错误报告更好一些。

目前,我已设置%define parse.error verbose(实际上会提供syntax error, unexpected ***********************, expecting ********************等消息。

我想要的只是在错误消息中添加更多信息,例如行号(在输入/文件/等中)

我当前的yyerror(没什么......不寻常......哈哈):

void yyerror(const char *str)
{
    fprintf(stderr,"\x1B[35mInterpreter : \x1B[37m%s\n",str);
}

P.S。

  • 我经历过latest Bison documentation,但我似乎很失落......
  • 我还看了一下%locations指令,它很可能非常接近我需要的东西 - 但是,我仍然没有找到完整的工作示例而且我是不知道如何使用它。

3 个答案:

答案 0 :(得分:5)

所以,我来这里是一步一步的解决方案

  • 我们在语法文件中添加%locations指令(在%}和第一个%%之间)
  • 我们确保我们的词法分析器文件包含我们的解析器的包含(例如#include "mygrammar.tab.h"),位于顶部
  • 我们在词法分析器文件中添加了%option yylineno选项(在%}和第一个%%之间)

现在,在我们的yyerror函数中(可能会在我们的词法分析器文件中),我们可以自由地使用它... yylineno (=正在处理的文件中的当前行)

void yyerror(const char *str)
{
    fprintf(stderr,"Error | Line: %d\n%s\n",yylineno,str);
}

是的。就那么简单! : - )

答案 1 :(得分:1)

对我有用的是在extern int yylineno文件中添加.ypp

/* parser.ypp */
%{
    extern int yylineno;
%}

/* scanner.lex */
...
%option yylineno

答案 2 :(得分:0)

Bison附带了许多示例以演示其功能,请参阅计算机上的/usr/local/share/doc/bison/examples(前缀/usr/local取决于您的配置。

您可能会对这些示例特别感兴趣:

  • lexcalc使用优先级指令和位置跟踪。它使用Flex生成扫描仪。
  • bistromathic演示了使用Bison的最佳实践。
    • 其手写扫描仪可跟踪位置。
    • 它的界面是纯净的。
    • 它使用error令牌进行错误恢复。
    • 其界面是“增量”界面,非常适合互动:它使用 push-parser API,将传入的令牌提供给解析器。
    • 它具有交互式命令行,并基于 解析器状态,基于yyexpected_tokens
    • 它使用Bison的标准目录对生成的内容进行国际化 消息。
    • 它将自定义语法错误与位置,提前校正和 令牌国际化。
    • 它支持带有语义值的调试跟踪。
    • 它使用命名引用而不是传统的$ 1,$ 2等。