質問

プロジェクト内で複数の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に変更されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top