ANTLR Webサイトでサンプルテンプレートを見つけました。そのJavatreeparser.gは、必要なASTを生成できるとサイトが言っていますが、ANTLRを初めて使用するので、どのように表示させるのですか?これまでに行ったことは、既存のJava文法と一緒に文法ファイルを配置することです。しかし、ファイルから必要なASTを使用して出力する方法がわかりません。どうすればいいのですか?
2 に答える
ANTLR Webサイトでサンプルテンプレートを見つけました。そのJavatreeparser.gは、必要なASTを生成できるとサイトが言っています。
Java.g
いいえ、 ANTLR wikiの結合された文法は、 Javaソースファイルのレクサーとパーサーを生成します。次に、パーサーはこのソースのASTを構築し、このASTを使用しJavaTreeParser.g
てトラバースできます。ツリー文法JavaTreeParser.g
は、ASTの作成には使用されません。これは、から作成されたパーサーによって実行されJava.g
ます。
これまでに行ったことは、既存のJava文法と一緒に文法ファイルを配置することです。
それは正しくありません。ツリー文法JavaTreeParser.g
は、パーサーが生成した入力としてASTを想定していますJava.g
。別のパーサー(または、さらに言えば、他のツリー文法)をプラグインすることはできません。
しかし、ファイルから必要なASTを使用して出力する方法がわかりません。どうすればいいのですか?
この以前のQ&Aを参照してください:ANTLRで作成されたASTの視覚化(.Net環境で)
編集
最初に自分で試してもらいたかったので、すぐに投稿したくありませんでした(はい、つまり!);)
簡単なデモは次のとおりです。
- ディレクトリ内のをコピーし、そこからand宣言
Java.g
を削除します。@header{...}
@lexer:::header{...}
antlr-3.3.jar
同じディレクトリにコピーします。- ファイル
Main.java
を作成しTest.java
、このディレクトリに作成します(以下を参照)。
Test.java
public class Test {
int i = 1 + 2;
String s;
Test(String s) {
this.s = s;
}
}
Main.java
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import org.antlr.stringtemplate.*;
public class Main {
public static void main(String[] args) throws Exception {
JavaLexer lexer = new JavaLexer(new ANTLRFileStream("Test.java"));
JavaParser parser = new JavaParser(new CommonTokenStream(lexer));
CommonTree tree = (CommonTree)parser.javaSource().getTree();
DOTTreeGenerator gen = new DOTTreeGenerator();
StringTemplate st = gen.toDOT(tree);
System.out.println(st);
}
}
次に、レクサーとパーサーを生成します。
java -cp antlr-3.3.jar org.antlr.Tool Java.g
.java
次に、すべてのソースファイルをコンパイルします。
javac -cp antlr-3.3.jar *.java
そして最後にMain
クラスを実行し、出力を。という名前のファイルにパイプしますast.dot
。
java -cp .:antlr-3.3.jar Main > ast.dot
(Windowsでは、次のようにしますjava -cp .;antlr-3.3.jar Main > ast.dot
:)
ここでファイルを開くと、パーサーによって生成されたASTのDOTast.dot
表現が表示されます。このASTを視覚化するには、DOTソースをhttp://graphviz-dev.appspot.comにコピーして貼り付け、次の画像を作成します。
私は本当にantlr4を使用することをお勧めします。
まず、CLASSPATH(antlr-4.5.3-complete.jarを含む)とJAVA_HOMEを設定します。
次に、文法Java.g4からレクサーとパーサーを生成します。
java -cp antlr-4.5.2-complete.jar Java.g4
第三に、生成されたすべてのJava*.javaをコンパイルします。
javac Java*.java
最後に、TestRigを実行します。
java org.antlr.v4.runtime.misc.TestRig Java compilationUnit -gui Test.java
ASTは次のように視覚的に表示されます。