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