Java 解析C++;使用ANTLR和获取编译器错误的代码段
我正在遵循一个教程,并试图使用ANTLR解析一些简单的代码片段,但我不能这样做,我得到了很多编译时错误,我无法解决,我张贴了一个截图,我在我的IDE中得到的错误Java 解析C++;使用ANTLR和获取编译器错误的代码段,java,parsing,antlr,Java,Parsing,Antlr,我正在遵循一个教程,并试图使用ANTLR解析一些简单的代码片段,但我不能这样做,我得到了很多编译时错误,我无法解决,我张贴了一个截图,我在我的IDE中得到的错误 包cplusparser; 导入java.util.ArrayList; 导入java.util.List; 导入org.antlr.v4.runtime.CharStreams; 导入org.antlr.v4.runtime.CommonTokenStream; 导入org.antlr.v4.runtime.tree.ParseTr
包cplusparser;
导入java.util.ArrayList;
导入java.util.List;
导入org.antlr.v4.runtime.CharStreams;
导入org.antlr.v4.runtime.CommonTokenStream;
导入org.antlr.v4.runtime.tree.ParseTreeWalker;
导入org.antlr.v4.runtime.tree.TerminalNode;
导入cpluplusparser.CPP14Parser.AbstractdeclaratorContext;
导入cpluplusparser.CPP14Parser.TranslationunitContext;
导入org.antlr.v4.*;
导入org.antlr.*;
导入org.antlr.runtime.tree.ParseTree;
公共类UppercaseMethodListener扩展了CPP14BaseListener{
私有列表错误=新建ArrayList();
//…错误的获取者
@凌驾
公共无效enterMethodDeclarator(AbstractdeclaratorContext ctx){
TerminalNode=ctx.Identifier();
String methodName=node.getText();
if(Character.isUpperCase(methodName.charAt(0))){
字符串错误=String.format(“方法%s大写!”,方法名);
错误。添加(错误);
}
}
//…错误的获取者
静态字符串javaClassContent=“public class SampleClass{void DoSomething(){}”;
静态CPP14Lexer java8Lexer=新的CPP14Lexer(CharStreams.fromString(javaClassContent));
静态CommonTokenStream令牌=新的CommonTokenStream(java8Lexer);
静态CPP14Parser=新的CPP14Parser(令牌);
静态TranslationunitContext树=parser.translationunit();
静态ParseTreeWalker=新ParseTreeWalker();
静态UppercaseMethodListener=新UppercaseMethodListener();
公共静态void main(字符串[]args){
走(听众,树);
断言(listener.getErrors().size(),为(1));
assertThat(listener.getErrors().get(0),
是(“方法DoSomething大写!”);
}
}
我建议签出(也包括错误)我在屏幕截图上看到的只是一堆扭曲的线条。请发布实际的错误消息。乍一看,您的注释承诺了一个从未定义过的getter方法,并且您的主方法中包含了类似于单元测试代码的代码,这似乎令人怀疑。
package cplusplusparser;
import java.util.ArrayList;
import java.util.List;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
import org.antlr.v4.runtime.tree.TerminalNode;
import cplusplusparser.CPP14Parser.AbstractdeclaratorContext;
import cplusplusparser.CPP14Parser.TranslationunitContext;
import org.antlr.v4.*;
import org.antlr.*;
import org.antlr.runtime.tree.ParseTree;
public class UppercaseMethodListener extends CPP14BaseListener {
private List<String> errors = new ArrayList<>();
// ... getter for errors
@Override
public void enterMethodDeclarator(AbstractdeclaratorContext ctx) {
TerminalNode node = ctx.Identifier();
String methodName = node.getText();
if (Character.isUpperCase(methodName.charAt(0))) {
String error = String.format("Method %s is uppercased!", methodName);
errors.add(error);
}
}
// ... getter for errors
static String javaClassContent = "public class SampleClass { void DoSomething(){} }";
static CPP14Lexer java8Lexer = new CPP14Lexer(CharStreams.fromString(javaClassContent));
static CommonTokenStream tokens = new CommonTokenStream(java8Lexer);
static CPP14Parser parser = new CPP14Parser(tokens);
static TranslationunitContext tree = parser.translationunit();
static ParseTreeWalker walker = new ParseTreeWalker();
static UppercaseMethodListener listener= new UppercaseMethodListener();
public static void main (String []args ) {
walker.walk(listener, tree);
assertThat(listener.getErrors().size(), is(1));
assertThat(listener.getErrors().get(0),
is("Method DoSomething is uppercased!"));
}
}