1. ホーム
  2. grammar

[解決済み] シフトとリデュースの競合を解決するには?

2022-02-12 23:27:06

質問内容

論文に必要なパーサーを作るためにCUPを使っています。私の文法には、シフト/リデュースの競合があります。私はこの生産ルールを持っています。

command ::= IDENTIFIER | IDENTIFIER LPAREN parlist RPAREN;

という警告が表示されます。

Warning : *** Shift/Reduce conflict found in state #3
between command ::= IDENTIFIER (*) 
and     command ::= IDENTIFIER (*) LPAREN parlist RPAREN 
under symbol LPAREN

今、本当はずれて欲しかったので、かなり大丈夫なのですが、教授から「矛盾を解決する方法を見つけなさい」と言われました。私は盲目です。いつもif/elseのコンフリクトについて読んでいますが、私にはこれが該当しないように思えます。 あなたは私を助けることができますか?

追伸:IDENTIFIER, LPAREN "(" と RPAREN ")" はターミナルで、parlist と command はターミナルではありません。

解決方法は?

あなたの問題は、これらのルールの中に全くないのです。Michael Mrozek氏の回答は、quot;dangling else問題を解決するための正しいアプローチですが、目下の問題を把握できてはいません。

エラーメッセージを見ると、shift / reduceの競合があることがわかります。 LPARENのレキシング時 . このルールだけでは、コンフリクトは発生しないと確信しています。

文法が見えないので、どうしようもないのですが。しかし、あなたのコンフリクトは、おそらく command で始まる別のルールが続きます。 LPAREN .

の後にある可能性のある他の規則を調べます。 command で始まり LPAREN . その後、ルールを固めることになります。特定の入力に対して文法が誤っている可能性が非常に高いのです。