可能重复:
Python/YACC:解决移位/减少冲突
我正在尝试使用 Ply 创建一个解析器,它实现了一个像 Yacc 这样的 LALR(1) 解析器。但是,我遇到了困难的减少/减少冲突。据我所知,我的语法没有歧义,相反,冲突源于 LALR(1) 解析器的有限前瞻。我猜A A
是遇到问题的时候会出现问题,因为解析器需要知道是否有第三个token来决定是否归约t1
。那么如何将其分解为只需要单个标记前瞻的语法呢?
from ply import lex, yacc
tokens = ('A','B')
t_A = 'A'
t_B = 'B'
def p_top(p):
'top : t1\n| t2'
def p_1(p):
't1 : t7 t6'
def p_2(p):
't2 : t3 t4\n| B'
def p_3(p):
't3 : t6\n| B'
def p_4(p):
't4 : t5 t5\n| B'
def p_5(p):
't5 : t6\n| B'
def p_6(p):
't6 : A'
def p_7(p):
't7 : A'
lexer = lex.lex()
parser = yacc.yacc(debug=True)
parser.parse('AAA')
这是 Ply 调试输出中的相关状态,尽管我不太了解它。
state 1
(13) t7 -> A .
(12) t6 -> A .
! reduce/reduce conflict for A resolved using rule 12 (t6 -> A .)
B reduce using rule 12 (t6 -> A .)
A reduce using rule 12 (t6 -> A .)
! A [ reduce using rule 13 (t7 -> A .) ]