-1

バイソンでパーサーを作成しようとしていますが、パーサーで特定の単一文字端末を使用すると、本当に奇妙なコンパイル エラーが発生します。

これは機能します:

nonterminal1: 'a' nonterminal2 'b';

しかし、これはコンパイルされません:

nonterminal1: '{' nonterminal2 '}';

どういうわけかこれらの文字をエスケープする必要がありますか? 私はかなりの数の Google 検索を試み、O'Reilly の flex & bison book をざっと読みましたが、これについては何も見つかりませんでした。

4

1 に答える 1

1

反例による証明:

%%
nonterminal1: 'a' nonterminal2 'b';
nonterminal1: '{' nonterminal2 '}';
nonterminal2: '.' | '!';

バイソンは文句なしにそれをコンパイルします。Yacc の他の 3 つの変種を試しました。すべてが文句なしにそれをコンパイルしました。a/b 行なしでもコンパイルできます。bisonファイルで実行する限りテストしました。その上で C コンパイラをテストしませんでしたが、Bison によって生成されたコードが有効でない場合は驚くべきことです。

問題は、あなたが縮小したものほど単純ではありません。そのため、Bison からのエラー メッセージとともに、何がうまくいかないかの実際の SSCCE ( Short, Self-Contained, Correct Example ) を提供してください。に指定しているオプションがあれば、それもbison教えてください。bison(C ファイル) からの出力をオブジェクト ファイルにコンパイルするときに問題が発生する場合は、そのことも記載する必要があります。

(記録として、Bison のバージョンは 2.3 で、Mac OS X 10.7.5 で動作していました。)

'プログラミング以外の特定のエディタを使用している場合、引用文字が ASCII (39; Unicode U+0027)以外のものに変更されている可能性があることに注意してください。これは物事を台無しにするでしょう。ただし、一方の行が変更され、もう一方の行が変更されなかった理由は明らかではありません。問題を解決するには、エラー メッセージを表示する必要があります。

于 2012-11-20T04:18:20.737 に答える