Bison语义谓词语法错误,流浪'#'

时间:2018-05-27 09:09:52

标签: c bison

所以我正在尝试使用野牛的semantic predicate功能,但我一直在尝试使用它来解决一些问题。

当我尝试使用gcc编译生成的.tab.c文件时出现问题。我正在使用gcc 7.1.0和bison 3.0.4。这是编译错误的片段:

test2.tab.c: In function ‘yyuserAction’:
test2.tab.c:811:12: error: stray ‘#’ in program
     if (! (#line 19 "test2.y" /* glr.c:816  */
            ^
test2.tab.c:811:13: error: ‘line’ undeclared (first use in this function); did you mean ‘uint’?
     if (! (#line 19 "test2.y" /* glr.c:816  */
             ^~~~
             uint

所以我采用了野牛的语义谓词示例,并将其作为一个有效的例子:

%{

int new_syntax = 0;
int yyerror(const char* msg) { /* some error handling */ }

%}

%token id

%glr-parser

%%

prog: %empty
    | prog widget
    | prog flip
    ;

widget: %?{  new_syntax } "widget" id old_arg
      | %?{ !new_syntax } "widget" id new_arg
      ;

flip: "flip" { new_syntax = !new_syntax; }
    ;

old_arg: /* something here */
       ;
new_arg: /* something else here */
       ;

%%

在使用选项卡文件之后,我意识到在#line指令之前添加换行符可以解决语法错误,(但是直接修改生成的文件会让人觉得有点hacky。另外,你必须与之对齐一些空格,以便gcc计算代码的右列位置。)

我想知道这是一个野牛本身的错误,还是我使用语义谓词错误,或者这个语法在早期版本的gcc中是正确的还是别的。

我也尝试在网上搜索此问题,或者已经提交过野牛的错误,但我没有找到。 (最新的野牛版似乎已经有3年了。如果这个问题没有在任何地方得到解决,我会感到惊讶)。有人可以告诉我这个问题吗?感谢。

如果有必要,我可以尝试用野牛提出一个错误(需要弄清楚如何做到这一点),但我不确定这是我自己的问题还是不是。

1 个答案:

答案 0 :(得分:1)

据我所知,这个bug已经存在了一段时间(可能是因为引入了语义谓词功能,虽然看起来有人应该在某些时候用某种版本的野牛测试它。)

最简单的解决方法是关闭#line指令的生成,只需将-l(或--no-lines)添加到bison命令行即可。但是,这将使解释错误消息变得更加困难,否则这些错误消息将引用您的野牛语法文件中的行号。

作为第二种解决方法,您可以找到文件c.m4,该文件可能位于/usr/share/bison/c.m4(当然,这取决于您的发布)。该文件的第462行(在bison 3.0.4中)读取:

    if (! ($2)) YYERROR;

如果您在$2之前添加换行符,则会显示

    if (! (
           $2)) YYERROR;
然后一切都应该没问题。 (至少,当我测试时它确实发生了。)