2

スタンドアロンのC++コードを生成するLALRパーサージェネレーターはありますか?「Parser.cpp」や「Parser.hpp」などの名前の2つのファイルが生成され、生成されたパーサーは、解析に使用できる単一のクラス(任意の名前空間でラップできる)に実装されることを期待しています。ニーズ。

楽しみのために(つまり、小さな個人的なプロジェクトで)使用したいのですが、出力をスタンドアロン(ヘッダーなし)にして、C++コンパイラーがあればどこでもコンパイルできるようにしたいです。

これまでの検索:

flex / bisonを見てきましたが、どちらも特別なヘッダーとライブラリが必要です。ANTLRについても少し見てきましたが、スタンドアロンのC++コードを生成できるかどうかはわかりません。誰かがそれができることを確認できれば、私はそれをもっと調べるかもしれません。

4

3 に答える 3

3

GOLDパーサー(Bart Kiersがウィキペディアのリストに言及)は、CおよびC++言語をサポートしています。完全に自己完結型のC/C++ソースコードファイルは生成されません。それが行うのは、「解析エンジン」によって使用できるレクサー/パーサーテーブルの生成だけです。

あなたのタスク(または同様の何か)を達成するために、私は次のことをしました:

  1. LALR文法をゴールドの形式で準備します

  2. 解析テーブルを生成します(1つのバイナリファイル)

  3. 古いトリックを使用して、バイナリファイルを次のようなヘッダーファイルに変換します

    unsigned char ParseTable [] = {...};

  4. 「解析エンジン」ソースからローダーを変更します(または、私が覚えているように、メモリ内の読み込みをサポートするCバージョンを使用します)

  5. GPEngineのソース(C ++バージョンの場合)を.h/.cppペアに結合します。

  6. ParseTableを.cppに追加します

確かに、それはそれほど単純ではありませんが、すべてのステップは、原則として、複数の文法で使用できる単一の「結合」スクリプト内で実行できます。

主な欠点は、GOLDがクローズドソースでWindowsのみであるという事実だと思います(つまり、解析テーブルを作成するには、Windowsマシンを使用する必要があります)。

于 2012-06-01T14:48:49.890 に答える
1

ANTLRはC++コードを生成できますが、私見ではC ++のサポートは少し弱いと思いますが、Cコードに似ています。それでも、構文ツリーのグラフィック表現を提供するANTLRWorksを使用するのは良い環境です。

于 2012-06-01T07:01:11.093 に答える
1

flex + bisonからの出力は、2つの.cファイルと1つの.hファイルで構成されます。これらは完全にスタンドアロンであり、パーサーを使用するためにアプリケーションにコンパイルする必要があるのはこれらだけです。(標準のCのもの以外に)追加のライブラリやヘッダーは必要ありません。

私があなたの要件を誤解していない限り、あなたは間違いなくflex+bisonであなたが望むことをすることができます。

于 2012-06-01T07:14:30.853 に答える