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 {};
IFST1とIFST2のルールは明らかにあいまいです。お互いを区別するものはありません。この文法は、あなたがそれを再編成するまで飛ばないでしょう。あなたはELSEを処理した後でなければ、あなたが持っている2つのIF文の型のどちらを標準出力で識別するのを延期しなければならないでしょう。 –
それは不可能だと思います。私はすでに似たようなことをしました。今度はバッファのスタックがあります。 IFとELSE文は現在のバッファをスタック上の次のバッファに変更します。独断は異なるスタックに書き込む。最後にendif部分でこれらのバッファが正しい順序で出力され、IFまたはIFELSE文が正しく展開されます。しかしながら、これはまだ十分ではありません。なぜなら、単一の文言は、それがif文かifelse文かに応じて異なって拡張することができるからです。 – taytay