1

可能重复:
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 .) ]
4

0 回答 0