分解LALR语法

时间:2012-10-13 20:06:34

标签: grammar lalr ply

  

可能重复:
  Python/YACC: Resolving a shift/reduce conflict

我正在尝试使用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 .) ]

0 个答案:

没有答案