我正在尝试使用Ply创建一个解析器,它实现了像Yacc这样的LALR(1)解析器。但是,我遇到了一个难以减少/减少的冲突。据我所知,我的语法没有歧义,相反,冲突源于LALR(1)解析器的有限前瞻。我猜测遇到A A
时会出现问题,因为解析器需要知道是否有第三个令牌来决定是否缩减为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 .) ]