尽管指定了运算符的优先级,但这个语法给了我冲突。即使在龙书中,它也已经以这种方式解决了(下面第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)
答案 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))