複数のフレックス/バイソンパーサー
-
06-07-2019 - |
質問
プロジェクト内で複数のFlex / Bisonパーサーを処理する最良の方法は何ですか?
パーサーを作成しましたが、同じプロジェクトに2つ目のパーサーが必要になりました。これまでのところ、 parser1.y
の3番目のセクションで main(..)
メソッドを挿入し、そこから yyparse
を呼び出しました。
取得したいのは、2つの異なるパーサー( parser1.y
と parser2.y
)を持ち、それらを外部関数から使用できるようにすることです(< main.cpp
のcode> main )。
.y
ファイルの外部で yyparse
関数をエクスポートするために使用すべき注意事項と、2つのパーサーをどのように処理する必要がありますか?
PS。私はg ++を使用してコンパイルしますが、FlexおよびBisonのC ++バージョンは使用せず、このように保ちたいと思います(したがって、パーサーをオブジェクト内にカプセル化しないようにします)。
解決
Bisonには、シンボルの前に「yy」ではなく「zz」を付ける「-p zz」オプションがあります。
同様に、Flexには、シンボルの前に「yy」ではなく「zz」を付ける「-P zz」オプションがあります。パフォーマンスレポートに「-p」を使用します。 '彼らはお互いに一貫性がないのは残念です。
他のヒント
レフラーの答えに加えて、ここで別のアプローチを提供したいと思います:
.lex
ファイルでは%option prefix =&quot; PREFIX&quot;
を使用でき、 .y
ファイルでは次を使用できます。 %define api.prefix PREFIX
。これは、 -p PREFIX
をBisonに、 -P PREFIX
をFlexに渡すことと同じことを行います。
デフォルトのプレフィックス yy
をオーバーライドした後、元の yy *
とオーバーライドした PREFIX *
の両方を介して内部名にアクセスできます。 、明らかに外部名については、 PREFIX *
を使用してそれらにアクセスする必要があります。
Bison 3.0以上を使用している場合は、%define api.prefix {foo _}
をご覧ください。これは、すべての yy
および YY
プレフィックスの foo _
および FOO _
。
Bison 2.6と3.0の間では、中括弧はありませんでした:%define api.prefix foo _
。
api.prefix変数はもう機能していません(コンパイルエラーが発生しています)
%define api.prefix {PREFIX}
次の構文を使用する必要がありました
%name-prefix="PREFIX"
すでに述べた内容に加えて、「%define api.prefix {PREFIX}」を使用すると、yytext&amp;&amp;の名前も変更されます。 yyparseからPREFIXtextおよびPREFIXparseへ。プレフィックスの周りの{}を忘れないでください!
同じことが '%option prefix =&quot; PREFIX&quot;'にも当てはまります。 lexでは、レクサーの名前はPREFIXlexに変更されます。