2016-03-21 1 views
0

を削減/削減、私は明らかにしています還元/還元衝突を解決します。具体的には、私はそれらの両方がTOKEN END可能性が2つの作品(FirstProductionとSecondProduction)を持っていると言います。YACCと私は特定の式は2つの作品を一致させることができます文法を持っている場合は、競合

その後yaccは(FirstProductionまたはSecondProduction)にTOKEN ENDを減らすために何を知ることができなくなります。しかし、私はyaccは、このような状況でFirstProductionを優先しているので、それを作りたいです。それをどうすれば実現できますか?

FirstProductionSecondProductionの両方が大量になる可能性があり、Bodyはこれらの競合する唯一の場所です。

また、私はこのような状況では、yaccは文法で宣言された最初の生産を選択することを知っています。ただし、警告を減らす/減らすことは避けたい。

+1

あなたは 'Body:FirstProduction | SecondProduction'、そう? – rici

+0

BodyはFirstProductionsのリスト、またはSecondProductionsのリスト(FirstまたはSecondプロダクションのインスタンスが0以上のリスト)になることを反映するように編集しました。このように、私はあなたが言ったことを意味するのではなく、私が言ったことは(編集したものの)、確かに。 –

答えて

1

あなたは第二のリストは、最初のリストの一部とすることができる何かを開始することができないように文法をリファクタリングすることができます

Body: FirstProductionList SecondProductionList 
    | FirstProductionList 
    ; 

FirstProductionList: FirstProductionList FirstProduction 
        | /* empty */ 
        ; 

SecondProductionList: SecondProductionList SecondProduction 
        | NonFirstProduction 
        ; 

NonFirstProductionSecondProductionに固有の任意の生産で、そしてからの移行をマーク減らすFirstProdutionsからSecondProductions

1

Bisonは、明示的に他よりも優先として1つの製造をマークする方法がありません。このような唯一のメカニズムは優先順位の関係であり、シフト/リダクションの競合を解決します。あなたが言うように、ファイルの順序は暗黙の優先順位を提供します。 %expect宣言で警告を抑制することができます。残念ながら、それはあなたがバイソンに予想される競合の数を通知するだけで、競合することはありません。

関連する問題