问题描述
我正在尝试使用Visual Studio Code中的Java从解析器树构建AST。至此,a生成了语法,然后生成了解析器树。我想用Visitor生成AST,所以我根据给定的BaseVisitor类制作了一个特定的Visitor类。
测试类:
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.*;
public class Testear{
public static void main(String[] args) throws Exception{
String inputFile=null;
if(args.length>0) inputFile=args[0];
InputStream is =system.in;
if(inputFile!=null){
is=new FileInputStream(inputFile);
}
ANTLRInputStream input = new ANTLRInputStream(is);
ExprLexer lexer = new ExprLexer(input);
CommonTokenStream tokens=new CommonTokenStream(lexer);
ExprParser parser = new ExprParser(tokens);
parser.setBuildParseTree(true);
ParseTree tree = parser.prog();
System.out.println(tree.toStringTree(parser));
Visitor nv = new Visitor();
//HERE IT RETURNS NULL
String result= nv.visit(tree);
System.out.println("The result is: " + result);
}
}
访问者类别:
public class Visitor extends ExprBaseVisitor<String>{
@Override
public String visitPalabrasreservadas(ExprParser.PalabrasreservadasContext ctx){
//HERE THE VALUE IS THE CORRECT ONE
System.out.println("Result 1 : " + ctx.PALABRASRESERVADAS().getText());
return ctx.PALABRASRESERVADAS().getText();
}
@Override
public String visitNombresfuncion(ExprParser.NombresfuncionContext ctx){
System.out.println("Result 2 : " + ctx.NOMBRESFUNCION().getText());
return ctx.NOMBRESFUNCION().getText();;
}
}
因此,当我向程序提供输入时,解析器树将正确生成并打印所有树,但是访问者却不这样做,我不知道为什么它在此行中返回空值“ String result = nv.visit(tree);“。我不明白为什么在该行中它返回null,但是当我在Visitor类中打印值时(在此行中“ System.out.println(” Result 2:“ + ctx.NOMBRESFUNCION()。getText()); ”)为我显示正确的值。
任何帮助,我们都会感激的。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)