7

プロジェクト内で複数の Flex/Bison パーサーを処理する最良の方法は何ですか?

パーサーを作成しましたが、同じプロジェクトで 2 つ目のパーサーが必要になりました。ここまでの 3 番目のセクションで、メソッドparser1.yを挿入し、そこから呼び出しました。main(..)yyparse

私が取得したいのは、2 つの異なるパーサー (parser1.yおよびparser2.y) を持ち、それらを外部関数から使用できるようにすることです ( で想定mainmain.cppます)。

yyparse関数をファイルの外部にエクスポートする場合、どのような注意を払う必要が.yありますか? また、2 つのパーサーをどのように処理すればよいですか?

PS。私は g++ を使用してコンパイルしていますが、C++ バージョンの Flex と Bison は使用していません。この方法を維持したいと考えています (したがって、オブジェクト内にパーサーをカプセル化することは避けます)。

4

5 に答える 5

12

レフラーの答えに加えて、ここで別のアプローチを提供したいと思います。

.lexファイルではを使用でき、ファイル%option prefix="PREFIX".yはを使用できます。これは、 BisonおよびFlexに%define api.prefix PREFIX渡すのと同じことを行います。-p PREFIX-P PREFIX

デフォルトのプレフィックスをオーバーライドした後、元のプレフィックスとオーバーライドされたプレフィックスyyの両方を介して内部名にアクセスできますが、外部名の場合は、それらにアクセスするためにを使用する必要があります。yy*PREFIX*PREFIX*

于 2012-11-08T15:30:56.627 に答える
11

Bison は、シンボルの前に「yy」の代わりに「zz」を付ける「-p zz」オプションを提供していることに注意してください。

同様に、Flex には、シンボルの前に「yy」ではなく「zz」を付ける「-P zz」オプションが用意されています。パフォーマンス レポートに「-p」を使用します。残念なことに、それらは互いに一致していません。

于 2009-10-28T02:09:05.793 に答える
5

Bison 3.0 以降を使用している場合は、 を参照してください。すべてのおよび接頭辞がおよび%define api.prefix {foo_}に置き換えられています。yyYYfoo_FOO_

複数のパーサーに関するドキュメントを参照してください。

Bison 2.6 と 3.0 の間では、中括弧はありませんでした: %define api.prefix foo_.

于 2012-11-09T06:03:40.047 に答える
-1

既に述べたことに加えて、'%define api.prefix {PREFIX}' を使用すると、yytext && yyparse の名前も PREFIXtext および PREFIXparse に変更されます。接頭辞を {} で囲むことを忘れないでください。
同じことが lex の '%option prefix="PREFIX"' にも当てはまり、レクサーの名前が PREFIXlex に変更されます。

于 2014-02-26T09:21:42.003 に答える