11

私は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の競合について読んでいますが、私にはそうではないようです。手伝って頂けますか?

PS:IDENTIFIER、LPAREN "("およびRPAREN ")"は端末ですが、parlistおよびcommandはそうではありません。

4

3 に答える 3

9

2つのプロダクションがあります。

command ::= IDENTIFIER
command ::= IDENTIFIER LPAREN parlist RPAREN;

入力トークンが次の場合、これはシフト/削減の競合ですIDENTIFIER LPAREN。理由は次のとおりです。

  • LPARENリストしていない新しいプロダクションの開始である可能性があります。その場合、パーサーはIDENTIFIERすでにスタック上にあるをに減らし、残っcommandている必要があります。command LPAREN
  • それらは両方とも2番目のプロダクションの開始である可能性があるため、を見つけようとして、LPAREN隣のスタックにシフトし、読み続ける必要があります。IDENTIFIERparlist

次のようにして修正できます。

command ::= IDENTIFIER command2
command2 ::= LPAREN parlist RPAREN |;
于 2010-07-02T17:17:06.963 に答える
9

あなたの問題はそれらの規則にはまったくありません。Michael Mrozekの答えは、「ぶら下がっている他の問題」を解決するための正しいアプローチですが、目前の問題を把握していません。

エラーメッセージを見ると、LPARENを字句解析するときにshift/reduceの競合が存在することがわかります。ルールだけでは競合​​が発生しないと確信しています。

私はあなたの文法を見ることができないので、私はあなたを助けることができません。ただし、競合はおそらく、aの後に。commandで始まる別のルールが続く場合LPARENです。

command後になり、で始まる可能性のある他のルールを確認しLPARENます。次に、ルールを統合する必要があります。特定の入力に対して文法が間違っている可能性が非常に高くなります。

于 2010-07-22T13:16:18.440 に答える
1

優先順位を設定してみてください。

precedence left     LPAREN, RPARENT;

それはCUPに衝突を決定させ、左の試合を取ります。

于 2015-11-15T18:47:56.483 に答える