我有这个语法
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
;
答案 0 :(得分:2)
为什么同时拥有value
和expression
?在没有看到其余语法的情况下,我毫不犹豫地猜测导致这种冲突的expression
的使用,但我的猜测是它与不必要的单位生产有关。
另一方面,如果将所有运算符终端合并到binaryop
(除非所有二元运算符具有相同的优先级),您将无法解析优先级。所以我建议你找一个标准的表达式语法(比如在野牛手册或维基百科中),并以此为基础。