7

プロジェクトで、ファイル構造のパーサーコードを生成しようとしてflexいます。bison主なプログラミング言語はC++であり、プロジェクトは主に並列で実行されるオブジェクト指向設計に基づいています。

生成されたパーサーはCコードであり、再入可能ではないとflex聞きました。bisonグーグル、見つけflex++bisonc++。残念ながら、始めるための簡単なチュートリアルはありません。ほとんどの例はに基づいていbison/flexます。bison/flex一部の人々は、どういうわけかパーサーをC++コードに統合しました。彼らは「トリッキー」であるはずです...

とのドキュメントは私flex++bisonc++を助けません。チュートリアルと例、それらはすべてstdinから入力を取得し、stdoutにいくつかのメッセージを出力します。

パーサーに次の機能が必要です。

  1. パーサーは、通常の方法で定義されたC ++クラスである必要があります(ヘッダーとcppファイル)
  2. パーサーは、std::stringまたはstd::stringstreamまたはnullで終了するのいずれかからデータを受信しますchar*

とても混乱しています。または使用する必要がありますflex++/bisonc++flex/bison?そして、上記の条件を満たす方法でそれを行うにはどうすればよいですか?

4

3 に答える 3

3

flex/bison、flex++/bison++、flexc++/bisonc++ があります。flex++ と bisonc++ を混ぜたり合わせたりするのではなく、これら 3 つのペアのいずれかを選択するのが最善だと思います。Flexc++およびBisonc++のユーザー ガイドは次のとおりです。

Flexc++ Web サイトから:

Flexc++ は、flex や flex++ とは対照的に、C++ プログラムでの使用を明示的に意図したコードを生成します。よく知られている flex(1) プログラムは C ソースコードを生成し、flex++(1) は flex(1) によって生成された yylex 関数の周りに C++ のようなシェルを提供するだけで、C++ ソフトウェア開発に関する現在の考えをほとんどサポートしていません。これとは反対に、flexc++ は C++ クラスを作成し、事前定義されたメンバ関数 lex を正規表現に対して入力を照合し、正規表現が照合されたら C++ コードを実行する可能性があります。flexc++ によって生成されるコードは純粋な C++ であり、ユーザーはその言語が提供するすべての機能を適用できます。

Bisonc++ の Web サイトから:

Bisonc++ は、LALR(1) 文脈自由文法の文法記述を C++ クラスに変換してその文法を解析する汎用パーサー ジェネレーターです。bisonc++ に習熟したら、それを使用して、単純な卓上計算機で使用されるものから複雑なプログラミング言語まで、幅広い言語パーサーを開発できます。Bisonc++ は、Alain Coetmeur によって書かれたプログラム bison++ と非常によく似ています。適切に記述されたすべての bison++ 文法は、ほとんど、またはまったく変更を加えることなく、bisonc++ 文法に変換できるはずです。bison++ またはその前身である bison に精通している人は、bisonc++ をほとんど問題なく使用できるはずです。bisonc++ を使用したり、このマニュアルを理解するには、C++ プログラミングに精通している必要があります。

したがって、flexc++/bisonc++ は、古い flex/bison ユーティリティの単なるラッパーではありません。これらは、再入可能なスキャン/解析に使用される完全な C++ クラスを生成します。

于 2012-07-26T17:58:37.503 に答える
2

Flex は再入可能な C スキャナーを生成できます。Flex マニュアルのセクション19 Reentrant C スキャナーを参照してください。

同様に、Bison は再入可能な C パーサーを生成できます。詳細については、Bison マニュアルのセクション3.8.11 A Pure (Reentrant) Parserを参照してください。

C++ パーサーと std::string/stringstream ベースのパーサー データが絶対に必要ですか?

代替手段としてBoost.Spiritを見たことがありますか?

于 2012-07-26T17:40:34.597 に答える