0

での紛争削減:シフト私は競合を減らす私の3つのシフトを与えている以下の文法を持つミッドルールアクションバイソン

boolexpression:   boolexpression OR boolterm 
         | boolterm ; 

boolterm:    boolterm AND boolfact 
         | boolfact; 

boolfact:    "!" "(" boolexpression ")" 
         | "(" boolexpression ")" 
         | BOOLLITERAL 
         | expression boolop expression 

boolop:     "<"| ">"| BOOLOPLEQ /* <= */ | BOOLOPGEQ /* >= */ | BOOLOPEQ /* == */ | BOOLOPNEQ /* != */; 

expression:    sum ; 

sum:     sum "+" term   
         | sum "-" term  
         | term ; 

term:     term "*" factor 
         | term "/" factor 
         | factor; 

factor:     ID   
         | NUMBER  
         | "(" {/* rules to generate IR/*} expression ")"; 

私は{/* rules to generate IR/*}を削除するときに、すべてが正常に動作します。

+0

あなたが投稿した文法には矛盾がないので、あなたが見るコンフリクトは、あなたがあなたの投稿から除外した文法の他の部分から来ています... –

答えて

0

この競合は、factorルールの"("の直後にルールの真ん中のアクションがあるためです。この場合、短縮番号boolfact --> "(" boolexpression ")"factor --> "(" {/* rules to generate IR/*} expression ")"の両方に、最初のトークンが認識されるために"("トークンが含まれているため、これを行うことはできません。したがって、バイソンが"("を認識すると、どのルールを減らすべきか分かりません。

の後に、"(" {/ rules to generate IR/*} expression ")";のあとに{/* rules to generate IR/}を置きます。 https://www.gnu.org/software/bison/manual/html_node/Mid_002dRule-Conflicts.html#Mid_002dRule-Conflictsにも役立つ情報があります。

関連する問題