antlr 生成的 java 代码未触发方法
Method not triggered from antlr generated java code
我正在尝试计算 java 代码 A.java 中的方法声明,使用 Antlr 为 Java 生成的解析器和词法分析器来自 Github。我正在尝试的代码如下:
TestListener.java
package antlrjavaparser;
import java.io.FileInputStream;
import java.io.InputStream;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
public class TestListener extends Java8BaseListener{
static int methodCount=0;
public static void main(String args[]) throws Exception {
InputStream in = new FileInputStream("src/main/java/A.java");
ANTLRInputStream input = new ANTLRInputStream(in);
if (in == null){
System.err.println("Unable to find test file.");
}
Java8Lexer lex = new Java8Lexer(input);
CommonTokenStream tokens = new CommonTokenStream(lex);
Java8Parser parser = new Java8Parser(tokens);
ParseTree tree = null;
tree = parser.compilationUnit();
ParseTreeWalker walker = new ParseTreeWalker();
Java8BaseListener listener = new Java8BaseListener();
walker.walk(listener, tree);
printTokens(lex);
System.out.println(methodCount);
}
private static void printTokens(Java8Lexer lex) {
// Print tokens
Token token = null;
while ((token = lex.nextToken()) != null) {
if (token.getType() == Token.EOF) {
break;
}
if (token.getChannel() == Token.HIDDEN_CHANNEL) {
continue;
}
System.out.println("Token: [" + token.getText() + "] Type:[" + token.getType() + "]");
}
lex.reset();
}
@Override
public void enterMethodDeclaration(Java8Parser.MethodDeclarationContext ctx) {
methodCount++;
}
}
methodCount
每次打印 0
。 A.java 是一个非常简单的 java class 包含一些方法。我已经尝试覆盖 Java8BaseListener
中的多个方法,以查看是否有任何方法被触发,但看起来它们没有被触发。我使用antlr错了吗?我使用 walker
的方式有什么问题吗?我两天前才开始研究这个,所以我不太了解 antlr。任何帮助将不胜感激。
Java8BaseListener listener = new Java8BaseListener();
在这里,您正在实例化基本侦听器,它什么也不做。您应该实例化它的子类。所以:
Java8BaseListener listener = new TestListener();
我正在尝试计算 java 代码 A.java 中的方法声明,使用 Antlr 为 Java 生成的解析器和词法分析器来自 Github。我正在尝试的代码如下:
TestListener.java
package antlrjavaparser;
import java.io.FileInputStream;
import java.io.InputStream;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
public class TestListener extends Java8BaseListener{
static int methodCount=0;
public static void main(String args[]) throws Exception {
InputStream in = new FileInputStream("src/main/java/A.java");
ANTLRInputStream input = new ANTLRInputStream(in);
if (in == null){
System.err.println("Unable to find test file.");
}
Java8Lexer lex = new Java8Lexer(input);
CommonTokenStream tokens = new CommonTokenStream(lex);
Java8Parser parser = new Java8Parser(tokens);
ParseTree tree = null;
tree = parser.compilationUnit();
ParseTreeWalker walker = new ParseTreeWalker();
Java8BaseListener listener = new Java8BaseListener();
walker.walk(listener, tree);
printTokens(lex);
System.out.println(methodCount);
}
private static void printTokens(Java8Lexer lex) {
// Print tokens
Token token = null;
while ((token = lex.nextToken()) != null) {
if (token.getType() == Token.EOF) {
break;
}
if (token.getChannel() == Token.HIDDEN_CHANNEL) {
continue;
}
System.out.println("Token: [" + token.getText() + "] Type:[" + token.getType() + "]");
}
lex.reset();
}
@Override
public void enterMethodDeclaration(Java8Parser.MethodDeclarationContext ctx) {
methodCount++;
}
}
methodCount
每次打印 0
。 A.java 是一个非常简单的 java class 包含一些方法。我已经尝试覆盖 Java8BaseListener
中的多个方法,以查看是否有任何方法被触发,但看起来它们没有被触发。我使用antlr错了吗?我使用 walker
的方式有什么问题吗?我两天前才开始研究这个,所以我不太了解 antlr。任何帮助将不胜感激。
Java8BaseListener listener = new Java8BaseListener();
在这里,您正在实例化基本侦听器,它什么也不做。您应该实例化它的子类。所以:
Java8BaseListener listener = new TestListener();