このpost about the antlr simple exampleは、Javaのための文法の作成方法を示しています。多言語生成のためのAntlr
ただし、Exp.gソースで文法とJavaソースコードが混在しています。
私の質問は、1つの文法ファイルを複数のJava、Scala、C++などのレクサー/パーサーの生成に使用できるように、文法ファイルをターゲット言語から切り離すことは可能ですか?
このpost about the antlr simple exampleは、Javaのための文法の作成方法を示しています。多言語生成のためのAntlr
ただし、Exp.gソースで文法とJavaソースコードが混在しています。
私の質問は、1つの文法ファイルを複数のJava、Scala、C++などのレクサー/パーサーの生成に使用できるように、文法ファイルをターゲット言語から切り離すことは可能ですか?
主にターゲットコードが文法で使用される理由によって異なります。発見されたトークン(例えば、シンボルテーブルや代替ツリー表現の作成など)で何かを行うアクションコードだけですか?そのようなネイティブコードを削除し、後で(パーズツリーウォーカーや訪問者を使用して)処理しても問題ありません。
ただし、述語は異なります。これらはパーサーのガイドに使用され、ネイティブコードも必要です。あなたができることは、生成されたパーサーが派生する基本クラスにすべてのネイティブコードを移動することです。この基本クラスをターゲット言語で書き直し、文法にネイティブコードがほとんどないようにするだけです(ネイティブコードを呼び出す単一の関数呼び出しを除く)。
このアプローチは、複数のターゲットでの使用を妨げるネイティブコードでもある、追加のライブラリ参照が不要(#include C/C++、他の言語でのインポート)であるという利点があります。
一般に、.g文法は、実際には、このExp.gの場合のように、ターゲット言語から切り離されています。たとえば、C#のターゲット:https://github.com/tunnelvisionlabs/antlr4cs、またはC++:http://www.soft-gems.net/index.php/tools/49-the-antlr4-c-target -ここにある 。 Java以外のターゲットを書くことは、ANTLRプロジェクトそのものを超えていると私は信じている。 –
@SimonMourier - 私はあなたがその質問を誤解していると思う。 Exp.gリファレンスはJavaと混在しています。そのこと、私は避けようとしている。 – NWS