Shift减少yacc中算术表达式的冲突

时间:2017-11-22 11:27:35

标签: compiler-construction bison yacc lex

尽管指定了运算符的优先级,但这个语法给了我冲突。即使在龙书中,它也已经以这种方式解决了(下面第7行实现的方式),但它仍然会发生冲突! 以下是yacc中实现的代码

%right THEN_KW
%right ELSE_KW
%left XOR_KW OR_KW
%right '='
%left AND_KW ALSO_KW
%left EQ_KW LT_KW GT_KW LE_KW GE_KW
%left PLUS_KW MINUS_KW
%left MULT_KW DIV_KW MOD_KW
%right NOT_KW
arthlogicexpr -> operand | arthlogicexpr arthop arthlogicexpr

arthop -> '+' | '-' | '*' | '/' |'%'

operand -> variable

variable -> IDENTIFIER

parser.output中的错误是:

state 141

   78 arthlogicexpr: arthlogicexpr . arthop arthlogicexpr
   78              | arthlogicexpr arthop arthlogicexpr .

    '+'    shift, and go to state 103
    '-'    shift, and go to state 104
    '*'    shift, and go to state 105
    '/'    shift, and go to state 106
    '%'    shift, and go to state 107

    '+'    [reduce using rule 78 (arthlogicexpr)]
    '-'    [reduce using rule 78 (arthlogicexpr)]
    '*'    [reduce using rule 78 (arthlogicexpr)]
    '/'    [reduce using rule 78 (arthlogicexpr)]
    '%'    [reduce using rule 78 (arthlogicexpr)]
    $default  reduce using rule 78 (arthlogicexpr)

    arthop  go to state 109

有关其他州的更多信息:

state 103

   79 arthop: '+' .

    $default  reduce using rule 79 (arthop)


state 104

   80 arthop: '-' .

    $default  reduce using rule 80 (arthop)


state 105

   81 arthop: '*' .

    $default  reduce using rule 81 (arthop)


state 106

   82 arthop: '/' .

    $default  reduce using rule 82 (arthop)


state 107

   83 arthop: '%' .

    $default  reduce using rule 83 (arthop)

2 个答案:

答案 0 :(得分:1)

由于执行冲突解决的方式,您不能像刚才那样考虑运算符。因为您要指定规则和令牌之间的优先级,所以您需要区分不能以相同方式处理的规则之间的区别。并且您不希望将exp: exp "+" exp视为等同于exp: exp "*" exp

所以保留四条规则,每个操作员一条。

如果真的想要考虑因素,你可以为每个优先级别定义一个规则,但是对于没有实际附加值的恕我直言会更复杂。

一个合适的工具应该告诉你,你的优先级指令(%right等)在这里没用。这提示冲突解决方案不能使用它们(因为你编写语法的方式)。我冒险Bison会发出警告。

您还应该看一下:

答案 1 :(得分:0)

如果你想避免警告,你需要指定操作员关联性,或者你需要构造语法,以便" arthlogicexpr"不在运营商的两边。

给出输入

a + b - c

你的语法是否含糊不清

arthlogicexpr(arthlogicexpr(a,+,b), - ,c)

或   arthlogicexpr(a,+,arthlogicexpr(b, - ,c))