我知道大多数移位/减少冲突可以通过使用 %left 或 %right 指令来解决。但即便如此,我也遇到了冲突。以下是我的语法块:
expression: variable '=' expression
| expression operator expression
| '-' expression %prec UMINUS
| '(' expression ')'
| value_holder
;
operator: relational_operator
| arithmetic_operator
;
relational_operator: LESS
| GREATER
| LESS_OR_EQUAL
| GREATER_OR_EQUAL
| EQUAL
| NOT_EQUAL
;
arithmetic_operator: '+'
| '-'
| '*'
| '/'
| '%'
;
我有如下的优先级和关联性指令:
%right '='
%left EQUAL NOT_EQUAL
%left LESS LESS_OR_EQUAL GREATER GREATER_OR_EQUAL
%left '+' '-'
%left '*' '/'
%left '%'
%right UMINUS
它仍然给出了 11 个换班错误。这是给出这些错误的状态 84。
State 84
33 expression: expression . operator expression
33 | expression operator expression .
EQUAL shift, and go to state 56
NOT_EQUAL shift, and go to state 57
LESS shift, and go to state 58
LESS_OR_EQUAL shift, and go to state 59
GREATER shift, and go to state 60
GREATER_OR_EQUAL shift, and go to state 61
'+' shift, and go to state 62
'-' shift, and go to state 63
'*' shift, and go to state 64
'/' shift, and go to state 65
'%' shift, and go to state 66
EQUAL [reduce using rule 33 (expression)]
NOT_EQUAL [reduce using rule 33 (expression)]
LESS [reduce using rule 33 (expression)]
LESS_OR_EQUAL [reduce using rule 33 (expression)]
GREATER [reduce using rule 33 (expression)]
GREATER_OR_EQUAL [reduce using rule 33 (expression)]
'+' [reduce using rule 33 (expression)]
'-' [reduce using rule 33 (expression)]
'*' [reduce using rule 33 (expression)]
'/' [reduce using rule 33 (expression)]
'%' [reduce using rule 33 (expression)]
$default reduce using rule 33 (expression)
operator go to state 68
relational_operator go to state 69
arithmetic_operator go to state 70
我无法弄清楚为什么这些指令不起作用。
如果需要,这是解析器文件:parser.y
编辑:文件parser.y
已被删除。