ANTLR v4、JavaLexer 和 JavaParser 返回 null 作为解析树
ANTLR v4, JavaLexer and JavaParser returning null as parse tree
我正在使用 antlr v4 提取 java 程序的解析树用于其他目的。我从这个样本开始:ANTLR v4 visitor sample
我已经测试了给定 link 上的步骤,以检查它是否有效以及是否一切正常:
java Run
a = 1+2
b = a^2
c = a+b*(a-1)
a+b+c
^Z
Result: 33.0
然后我自己编写了解析 java 程序的结构如下:
|_Java.g4
|_Java.tokens
|_JavaBaseVisitor.java
|_JavaLexer.java
|_JavaLexer.tokens
|_JavaParser.java
|_JavaTreeExtractorVisitor.java
|_JavaVisitor.java
|_Run.java
而Run.java如下:
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
public class Run {
public static void main(String[] args) throws Exception {
CharStream input = CharStreams.fromFileName("F:\Projects\Java\Netbeans\ASTProj\JavaTreeExtractor\prog.java");
JavaLexer lexer = new JavaLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
JavaParser parser = new JavaParser(tokens);
ParseTree tree = parser.getContext();
JavaTreeExtractorVisitor calcVisitor = new JavaTreeExtractorVisitor();
String result = calcVisitor.visit(tree);
System.out.println("Result: " + result);
}
}
但是在语句 ParseTree tree = parser.getContext();
中,树对象变为空。
由于我是 antlr 的新手,有什么建议可以让我检查或解决吗?
(如果需要更多信息,请通知我)。
TG.
你不应该这样做:
ParseTree tree = parser.input();
如计算器示例?
假设您正在使用语法 here,您希望解析 Java 文件的起点是
ParseTree tree = parser.compilationUnit();
(对于不使用该语法的任何人,您都需要您命名的顶级解析器规则。)
我正在使用 antlr v4 提取 java 程序的解析树用于其他目的。我从这个样本开始:ANTLR v4 visitor sample
我已经测试了给定 link 上的步骤,以检查它是否有效以及是否一切正常:
java Run
a = 1+2
b = a^2
c = a+b*(a-1)
a+b+c
^Z
Result: 33.0
然后我自己编写了解析 java 程序的结构如下:
|_Java.g4
|_Java.tokens
|_JavaBaseVisitor.java
|_JavaLexer.java
|_JavaLexer.tokens
|_JavaParser.java
|_JavaTreeExtractorVisitor.java
|_JavaVisitor.java
|_Run.java
而Run.java如下:
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
public class Run {
public static void main(String[] args) throws Exception {
CharStream input = CharStreams.fromFileName("F:\Projects\Java\Netbeans\ASTProj\JavaTreeExtractor\prog.java");
JavaLexer lexer = new JavaLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
JavaParser parser = new JavaParser(tokens);
ParseTree tree = parser.getContext();
JavaTreeExtractorVisitor calcVisitor = new JavaTreeExtractorVisitor();
String result = calcVisitor.visit(tree);
System.out.println("Result: " + result);
}
}
但是在语句 ParseTree tree = parser.getContext();
中,树对象变为空。
由于我是 antlr 的新手,有什么建议可以让我检查或解决吗?
(如果需要更多信息,请通知我)。
TG.
你不应该这样做:
ParseTree tree = parser.input();
如计算器示例?
假设您正在使用语法 here,您希望解析 Java 文件的起点是
ParseTree tree = parser.compilationUnit();
(对于不使用该语法的任何人,您都需要您命名的顶级解析器规则。)