2016-12-09 12 views
0

私はバイソンに新たなんだと私は/減らす競合シフトとのトラブルを抱えている...紛争Bisonは、パーサー

私はC言語の文法のルールを書いている:IDを特定するトークンですこのルールは、たとえ括弧で囲まれていても識別子が考慮されることを保証するために書かれています。バイソンの競合の

id    : '(' ID ')' {printf("(ID) %s\n", $2);} 
       |  ID  {printf("ID %s\n", $1);} 
       ; 

出力は次のとおりです。

State 82 

    12 id: '(' ID . ')' 
    13 | ID . 

    ')' shift, and go to state 22 

    ')'  [reduce using rule 13 (id)] 
    $default reduce using rule 13 (id) 

どのように私はこの競合を解決することができますか?

私はあなたのお手伝いをしてくれてありがとうと思います。

+0

それはバイソンの出力全体ですか?また、英語で提供できますか? – melpomene

+0

英語で正しい –

+2

文法の場合でも、[最小限の完全で検証可能な例](/ help/mcve)が必要です。 –

答えて

0

あなた自身のidルール自体は、シフト/リダクションエラーを引き起こすことはできません。あなたの文法には、IDを使う他の規則がなければなりません。たとえば、次のような表現ルールがあります。上記の例で

expr: '(' expr ')' 
    | ID 
    ; 

を、IDidまたはexprに減らすことができますし、パーサは取るためにどの削減を知りません。状態にあるもの22


編集を確認:「?私は紛争を解決するために何ができるか 」あなたが求める

私はC言語の文法のルールを書いている:ID変数を識別するトークンであり、括弧内に書かれていても識別子が考慮されるようにするためのルールです。

左辺の括弧内の変数はCでは無効ですそれは右側でのみ発生する可能性があります。それで、あなたはそれを式と見なすことができるので、あなたのルールを削除してください。idは、exprと置き換えてください。

+0

あなたは正しいです。 私はそのタイプのルールを持っています。もし私がコメントすれば、それ以上の葛藤はありません。 どうすればいいですか? –

+0

私の解決策の編集を参照してください。それが助けになる場合は、左の上矢印と下矢印の間のゼロをクリックして解決策を受け入れてください。 –

+0

あなたの答えは最高です。しかし、Cでは、文法的に言えば、コンパイルにエラーがないことを前提として、(A)=(b)が許可されています。 しかし私はあなたの解決策を採用します。ありがとうございました –

関連する問題