2009-10-28 9 views
5

プロジェクト内で複数のFlex/Bisonパーサーを処理する最良の方法は何ですか?複数のフレックス/バイソンパーサー

私はパーサーを作成しましたが、今は同じプロジェクトで2番目のパーサーが必要です。これまでのところ、parser1.yの3番目のセクションでは、main(..)メソッドを挿入し、そこからyyparseを呼び出しました。私は2つの異なるパーサ(parser1.yparser2.y)を有するされ得ると外部関数からそれらを使用することができるようにしたいどのような

(のはmain.cppmainを想定してみましょう)。

yyparseのファイルを.yのファイルの外にエクスポートする際に使用する予防措置と、2つのパーサーをどのように処理する必要がありますか?

PS。私はg ++を使ってコンパイルしていますが、FlexやBisonのC++バージョンではありません。このようにしておきたいのです(オブジェクト内にパーサをカプセル化しないでください)。

答えて

7

Bisonには、 'yy'の代わりに 'zz'をプレフィックス記号に付ける '-p zz'オプションがあります。

同様に、Flexには、 'yy'の代わりに 'zz'というプレフィックス記号を付ける '-P zz'オプションがあります。それはパフォーマンス報告のために '-p'を使います。 '彼らはお互いに一貫していない同情です。

+0

これを行うと、レクサーとパーサーにはYYTYPEやYYSTYPEなどの参照がたくさんあり、コンパイルに失敗します。なぜ変換されていないのですか?私は何を間違えているのですか?私はリエントラントパーサーを望んでいません、私はちょうど2つのパーサーのうちの1つを呼び出す1回限りのパーサを必要とし、その後プログラムは終了します。 – TimeHorse

+0

@TimeHorse:この質問に回答してからあなたのコメント/質問が出るまでの時間を考えれば、新しい質問をする必要があります。小さなレクサー/文法の2つの例(MCVE - [MCVE ])、使用しているビルドプロセスと表示されているエラーメッセージを表示します。あなたが新しい質問を得てその情報を提供する機会を奪わなければ、私は本当に答えを出すことはできません。是非、あなたの新しい質問を見て欲しいとここにコメントしておいてください。この質問へのリンクもあなたのものに含めることを検討してください。 –

10

レフラーの答えに加えて、私はここに別のアプローチを提供したいと思います:あなたは%option prefix="PREFIX"を使用することができ.lexファイルで

を、そして.yファイルにあなたは%define api.prefix PREFIXを使用することができ、渡すのと同じことをしていますBisonへの-p PREFIXおよびFlexへの-P PREFIX。デフォルトの接頭辞yyのオーバーライド後

お知らせ明らかに外部名のためにあなたがそれらにアクセスするために、あなたのPREFIX*を使用しなければならない一方で、あなたは、元yy* BOTHを介して内部名にアクセスし、あなたのPREFIX*を上書きすることができます。

+0

最新のバイソン版では、 '%define api.prefix {PREFIX}'を実行する必要があります。そうしないと警告が表示されます –

5

あなたはバイソン3.0以上を使用する場合は、foo_FOO_持つすべてのyyYYプレフィックスを置き換える%define api.prefix {foo_}を見て、持っています。

Documentation about Multiple Parsersを参照してください。

Bison 2.6と3.0の間には、かっこはありませんでした:%define api.prefix foo_。すでに述べたものに加えて

-1

あなたが使用している場合、それはまたPREFIXtextとPREFIXparseにyytext & &はyyparseの名前を変更します「%をapi.prefix {PREFIX}を定義します」。接頭辞のまわりの{}を忘れないでください!
lexの '%option prefix = "PREFIX"にも同じことが言えます。レクサーの名前はPREFIXlexに変更されます。