2011-12-14 6 views
0

次のコードでは、「IFST2規則は、confictsのために役に立たない」というエラーを示しています。私はifとif/elseブロックの一部について異なることを印刷しようとしています。これどうやってするの?Yacc、if/else構文のif部分の異なる実行

IFST1:IF  {printf("if begin");}; 
IFST2:IF  {printf("ifelse begin");}; 
ELSEST:ELSE {}; 


singlestatement: 
    '{' statement '}'; 
| 
IFST1 '(' expr ')' singlestatement ELSEST singlestatement {}; 
| 
IFST2 '(' expr ')' singlestatement %prec IFX {}; 
+0

IFST1とIFST2のルールは明らかにあいまいです。お互いを区別するものはありません。この文法は、あなたがそれを再編成するまで飛ばないでしょう。あなたはELSEを処理した後でなければ、あなたが持っている2つのIF文の型のどちらを標準出力で識別するのを延期しなければならないでしょう。 –

+0

それは不可能だと思います。私はすでに似たようなことをしました。今度はバッファのスタックがあります。 IFとELSE文は現在のバッファをスタック上の次のバッファに変更します。独断は異なるスタックに書き込む。最後にendif部分でこれらのバッファが正しい順序で出力され、IFまたはIFELSE文が正しく展開されます。しかしながら、これはまだ十分ではありません。なぜなら、単一の文言は、それがif文かifelse文かに応じて異なって拡張することができるからです。 – taytay

答えて

1

問題の全般的なヘルプについては、thisを確認してください。私はあなたが一般的なフォームに一致するようにあなたのケースを "専門化"しなければならないと思います。これはYACCではなくバイソンですが、どちらもLALRパーサジェネレータです。

関連する問題