0

1 つの DSL に対して、Java の UI エディターと C/C++ のインタープリターという 2 つのツールを実装する必要があります。私の最初のアイデアは、Java と C/C++ の両方のパーサーを生成できる ANTLR を使用することでした。しかし、私が見たすべての ANTLR の例には、言語固有のコードまたは設定が含まれています。

1 つの DSL に対して 2 つのパーサーを生成する方法はありますか?

これは、1 つの文法から 2 つのパーサーを生成する意味があるのでしょうか?

この問題に対して一般的に使用されるアプローチはありますか?

4

3 に答える 3

1

bison は、少なくともドキュメントによると、C++ および Java パーサーを生成できます (私は Java インターフェースを使用したことがなく、C++ インターフェースを使用したのは 1 回だけですが、動作すると言われています)。文法は問題になりませんが、アクションは問題になります。特に、異なる言語を使用しているだけでなく、2 つのパーサーで異なることを行っている可能性があるためです。$$ = method($1, $2, ...);ただし、すべてのアクションを簡単なステートメントにすることができる必要があります。

bison は C(++) プリプロセッサを使用しません (プリプロセッサ ディレクティブを bison 入力ファイルに入れるのが一般的であるため、実際には使用できませんでした) が、他のマクロ システムを使用することもできますm4。それを使用する方法を知っている場合、またはシェルスクリプトを使用してさまざまな入力ファイルを組み立てる場合に機能します。

もう 1 つの可能性は、パーサーで AST を作成することです。Antlr や bison などの任意のパーサー ジェネレーターを使用して、C または C++ で AST パーサーを構築し、JNI for Java で使用するために結果をラップすることができます。Antlr を使用すると、言語固有のコードをほとんど使用せずに AST ジェネレーターを生成できるため、単純なマクロ プロセッサを使用して、C++ と Java の両方でネイティブ AST パーサーを構築できると思います。しかし、それはあなたの言語がかなり単純であるかどうかにかかっています。

この問題に「一般的に使用されるアプローチ」があるかどうかはわかりませんが、かなり定期的に発生する問題であることは確かです。さまざまなプロジェクト間で多くの文法が共有されていますが、私が見た限りでは、最も一般的なアプローチは、文法をカット アンド ペーストして、アクションを書き直すことです。私はマクロ アプローチを数回実行しましたが、動作させることはできますが、あなたが望むほどエレガントではありません。

于 2013-07-14T02:38:51.280 に答える
0

yacc と jacc を試すことができます。 http://web.cecs.pdx.edu/~mpj/jacc/ http://dinosaur.compilertools.net/#yacc

それらは非常に似た構文を持っています.1つのソースファイルを使用できる手作りの前処理ツールの助けが必要かもしれません.

PS しかし、C++ で一度パーサーを作成し、JNI 経由で使用してみませんか?

于 2013-07-14T00:40:48.083 に答える
0

確かにANTLRを使用できます。言語固有の部分はアクションまたは述語です。それらが必要ない場合は、文法に言語固有のものはありません。ところで。使用するパーサー ジェネレーター (yacc、bison などを含む) に関係なく、必要な場合は常に文法に言語固有のものがあります。

于 2013-07-16T07:45:00.380 に答える