毕胜:错误信息中包含的行号。

问题描述 投票:3回答:2

好吧,我想我的问题是不言自明的。

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

目前,我已经设置了 %define parse.error verbose (它实际上给出了这样的信息 syntax error, unexpected ***********************, expecting ********************.

我只想在错误信息中添加更多的信息,例如:行号(在inputfileetc中)。

我现在 yyerror (好吧,没有什么......不寻常的......lol) 。

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

P.S.

  • 我已经通过了 最新的拜森文件但我似乎很迷茫...
  • 我也看了一下 %locations 指令,这很可能是 接近我所需要的东西--然而,我仍然没有找到完整的工作实例,我也不知道该如何使用。
c++ bison yacc lex flex-lexer
2个回答
8
投票

所以,我这里有一个 分步走 :

  • 我们增加以下内容: %locations 语法文件中的指令(在 %} 和第一个 %%)
  • 我们确保我们的lexer文件包含了一个解析器的include(例如. #include "mygrammar.tab.h"),在文件的顶部
  • 我们加上 %option yylineno 选项(介于 %} 和第一个 %%)

而现在,在我们的 yyerror 函数(它应该在我们的词典文件中),我们可以自由地使用这个... yylineno (=当前文件中被处理的行) :

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

是的,就这么简单!就这么简单! :-)


1
投票

我的工作是添加 extern int yylineno.ypp 文件。

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

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

0
投票

野牛号有许多例子来展示它的特点,见: /usr/local/share/doc/bison/examples 在您的机器上(其中前缀为 /usr/local 取决于您的配置。

这些例子可能会让你感兴趣。

  • lexcalc 使用先例指令和位置跟踪。 它使用Flex来生成扫描仪。
  • 双色球 展示了使用 Bison 时的最佳实践。
    • 它的手写扫描器可以跟踪位置。
    • 它的界面是纯粹的。
    • 它使用 error token来获得错误恢复。
    • 它的界面是 "增量式 "的,非常适合交互:它使用push-parser API将传入的令牌反馈给解析器。
    • 它的特点是有一个交互式的命令行,根据parser状态完成,基于 yyexpected_tokens.
    • 它使用Bison的标准目录对生成的消息进行国际化。
    • 它使用自定义的带有位置的语法错误、抬头校正和token国际化。
    • 它支持带有语义值的调试痕迹。
    • 它使用命名的引用,而不是传统的1元、2元等。
© www.soinside.com 2019 - 2024. All rights reserved.