重複の可能性:
Python/YACC: シフト/リデュースの競合の解決
Yacc のような LALR(1) パーサーを実装する Ply を使用してパーサーを作成しようとしています。しかし、reduce/reduce の難しい競合に遭遇しました。私が知る限り、私の文法にはあいまいさはありません。代わりに、競合は LALR(1) パーサーの制限された先読みに起因しています。A A
パーサーは、還元するかどうかを決定するために 3 番目のトークンがあるかどうかを知る必要があるため、 が発生したときに問題が発生すると推測して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 .) ]