我一直在尝试解决看似简单的移位/减少冲突,但无济于事。当然,如果我忽略冲突,解析器工作正常,但如果我重新组织我的规则,我会感觉更安全。在这里,我将一个相对复杂的语法简化为单个冲突:
statement_list
: statement_list statement
|
;
statement
: lvalue '=' expression
| function
;
lvalue
: IDENTIFIER
| '(' expression ')'
;
expression
: lvalue
| function
;
function
: IDENTIFIER '(' ')'
;
使用 yacc 中的详细选项,我得到了描述具有上述冲突的状态的输出文件:
state 2
lvalue -> IDENTIFIER . (rule 5)
function -> IDENTIFIER . '(' ')' (rule 9)
'(' shift, and go to state 7
'(' [reduce using rule 5 (lvalue)]
$default reduce using rule 5 (lvalue)
感谢您提供任何帮助。