如何解决这个yacc转移/减少冲突

时间:2016-11-14 16:44:50

标签: yacc lex

我有这个语法

value
    : INTEGER
    | REAL
    | LEFTBRACKET value RIGHTBRACKET
    | op expression
    | expression binaryop expression
    ;

我得到这个班次减少错误

47 expression: value .
53 value: LEFTBRACKET value . RIGHTBRACKET
RIGHTBRACKET  shift, and go to state 123
RIGHTBRACKET  [reduce using rule 47 (expression)]
$default      reduce using rule 47 (expression)`

到目前为止,我尝试设置%left和%right priority,但没有运气。我还试图使用一种新的语法来重新调用自己,但是我遇到了冲突。我也尝试了this解决方案

有什么想法吗?

提前谢谢

修改

expression
    : lvalue
    | value
    ;

lvalue
    : IDENTIFIER
    | lvalue LEFTSQBRACKET expression RIGHTSQBRACKET
    | LEFTBRACKET lvalue RIGHTBRACKET

binaryop
    : PLUS
    | MINUS
    | MUL
    | DIVISION
    | DIV
    | MOD
    ;

我设法使用这种语法克服了大部分冲突,但我仍然遇到上面提到的冲突

binaryop
    : expression PLUS expression
    | expression MINUS expression
    | expression MUL expression
    | expression DIVISION expression
    | expression DIV expression
    | expression MOD expression
    ;

1 个答案:

答案 0 :(得分:2)

为什么同时拥有valueexpression?在没有看到其余语法的情况下,我毫不犹豫地猜测导致这种冲突的expression的使用,但我的猜测是它与不必要的单位生产有关。

另一方面,如果将所有运算符终端合并到binaryop(除非所有二元运算符具有相同的优先级),您将无法解析优先级。所以我建议你找一个标准的表达式语法(比如在野牛手册或维基百科中),并以此为基础。