0

.y (yacc -- bison) ファイルの文法について、次のルールを定義しました。

C:E | D | ふ | あ

A:B | B '[' C ']' ;

(これは、オプションの [C] を持つ B のようなものです) 適切なレクサー ファイルを使用して適切な方法で .y ファイルをコンパイルすると、次の shift\reduce 競合が発生します。

状態 48
74 A: B .
75 | B. '[' C ']'
'[' シフトし、状態 91 に移動
'[' [reduce using rule 74 (A)]
$default reduce using rule 74 (A)

私の問題は、前任者 '[' がある場合は次のとおりです。縮小せずにシフトしたいのです。問題は、ドキュメントで何時間も検索しているときに、このエラーの解決策が見つからないことです。これを修正するにはどうすればよいですか (コード固有にしてください)。

4

2 に答える 2

0

A ルールを展開しようとすると、2 つの可能な状態が得られます。

状態 1:

A -> B

状態 2:

A -> B
A -> BC

A のすべての可能な状態は次のとおりです。

A -> B (State 1)
A -> B (State 2)
A -> BC

Bison は、B 入力の状態が 1 か 2 かを判断できません。

A ルールを次のように置き換えることができます (B と C がトークンであると仮定します)。

A: B | B C
于 2016-03-27T23:30:33.827 に答える