【问题标题】:Bison reset line number for each new fileBison 为每个新文件重置行号
【发布时间】:2013-04-21 09:13:15
【问题描述】:

我有一个使用GNU bisonflex 的简单解析器实现。它工作正常,我可以从命令行解析多个文件

./program file1.m file2.m 

我以相反的顺序加载文件(这并不重要)。

但问题是我得到的行号(假设file1.m 中存在语法错误)将是file1 中的行数加上file2 中的行数。

所以野牛不会在每个文件之后重置行号。怎样才能做到这一点?我用谷歌搜索了一下,找到了yy_flush_buffer,但我不确定如何使用它,或者它是否真的是我需要的。

有人知道怎么做吗?提前谢谢你。

【问题讨论】:

    标签: parsing bison flex-lexer


    【解决方案1】:

    行号由变量yylineno 中的flex 生成的代码维护。这些行号是从bison 传递给代码的一种或另一种方式。可能有其他方法可以重置行号,但老派方法是在对新文件调用 yyparse 之前将变量 yylineno 设置为 1。您将不得不使用%option yylinenoflex 保持行号的性能略有下降,但您可能已经这样做了。

    【讨论】:

    • 谢谢。 yyset_lineno(int) 没用。它说的是旧的未定义参考。我在词法分析器中有%option yylineno。我不知道为什么该功能不可用。无论如何,我设法通过在调用yyparse 之前将每个文件的yylineno 设置为1 来修复它。谢谢。
    • 不过,如果我知道如何使用 yyset_lineno(int),那就太好了。看到原始的 yylineno 不太好。然而,这只是好奇。没有什么绝对必要的。
    • 嗯,可能是 flex 的不同版本。我会坚持使用旧学校设置yylinenoyyset_lineno 几乎没有更好,因为它做的事情完全相同。我将删除yyset_lineno 的建议。我确实添加了你应该使用%option yylineno
    猜你喜欢
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2020-09-15
    • 2018-12-08
    • 2013-03-31
    • 2020-02-05
    • 2012-08-23
    • 1970-01-01
    相关资源
    最近更新 更多