0

我知道大多数移位/减少冲突可以通过使用 %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已被删除。

4

0 回答 0