冲突野牛解析器

时间:2016-12-09 11:07:35

标签: c compiler-construction bison lex

我是Bison的新手,我在转换/减少冲突方面遇到了麻烦......

我正在为C语言编写语法规则:ID是一个标识变量的标记,我编写了这个规则,以确保即使用括号写的标识符也可以考虑。

id              : '(' ID ')'    {printf("(ID) %s\n", $2);}
                |     ID        {printf("ID %s\n", $1);}
                ;

Bison冲突的输出是:

State 82

   12 id: '(' ID . ')'
   13   | ID .

    ')'  shift, and go to state 22

    ')'       [reduce using rule 13 (id)]
    $default  reduce using rule 13 (id)

如何解决此冲突?

我希望我很清楚,谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

您的id规则本身不会导致转移/减少错误。您的语法中必须有一些使用ID的其他规则。例如,您有一个表达式规则,例如:

expr: '(' expr ')'
    | ID
    ; 

在上面的示例中,ID可以缩减为idexpr,并且解析器不知道要采取哪种缩减。检查状态22中的内容。

<小时/> 编辑:你问&#34; 我该怎么做才能解决冲突?&#34;

  

我正在编写C语言的语法规则:ID是一个标识变量的标记,我写了这个规则以确保标识符可以被考虑,即使它是用括号写的

作为左侧的括号中的变量在C中无效,因此它只能出现在右侧。然后,您可以将其视为表达式,因此只需删除您的规则以及使用id的位置,将其替换为expr