为什么我的 Antlr ParseTree 是空的? / 怎么调用 AbstractParseTreeVisitor.visit(ParseTree) 是空的?

问题描述 投票:0回答:0

我正在使用 Java 中的 Antlr 构建解释器,我遇到了 NullPointerException。我让它读取的文件不是空的,但是 ParseTree 和 AbstractParseTreeVisitor.visit(ParseTree) 是空的,我不知道出了什么问题。

我一直在尝试调用

progVisitor.visit(antlrAST)
的内容,打印的时候是null。当我把它放在一个变量中并将它作为另一个类的参数传递时,它返回一个 NullPointerException。

同时,打印解析树

antlrAST
给我一个
[]
。我不确定问题出在哪里,因为打印解析树点获取文本 -
antlrAST.getText()
- 打印整个内容就好了。

下面是相关代码:

来自主类的片段:

    public void parse() {
        String fileName = "code.txt";
        MachDefParser parser = getParser(fileName);
        //tell antlr to build a parse tree
        //parse from start symbol 'prog'
        ParseTree antlrAST = parser.prog();
        System.out.println("Parse Tree: " + antlrAST);
        
        //create visitor to convert parse tree into Program/Expression object
        AntlrToProgram progVisitor = new AntlrToProgram();
        Program prog = progVisitor.visit(antlrAST);
        System.out.println("Parse Tree Content:\n" + antlrAST.getText());
        System.out.println(prog == null);

        ExpressionProcessor ep = new ExpressionProcessor(prog.getExpressions());
        for(String evaluation: ep.getEvaluationResults()) {
            System.out.println(evaluation);
        }
    }
    
    private static MachDefParser getParser(String fileName) {
        MachDefParser parser = null;
        
        try {
            CharStream input = CharStreams.fromFileName("src//" + fileName);
            MachDefLexer lexer = new MachDefLexer(input);
            CommonTokenStream tokens = new CommonTokenStream(lexer);
            parser = new MachDefParser(tokens);
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        return parser;
    }
public class AntlrToProgram extends MachDefBaseVisitor<Program> {
    public AntlrToProgram() {

    }

    public Expression visitProgram(MachDefParser.ProgContext ctx) {
        Program prog = new Program();
        
        AntlrToExpression exprVisitor = new AntlrToExpression();
        //System.out.println(ctx.getChildCount());
        //helper visitor for transforming each subtree into Expression object
        for(int i = 0; i < ctx.getChildCount(); i++) {
            if(i == ctx.getChildCount()-1) {
                // last child of start symbol prog is EOF
                //do not visit child and attempt to convert to Expression object
            }
            else {
                prog.addExpression(exprVisitor.visit(ctx.getChild(i)));
                System.out.println("Adding to prog: " + exprVisitor.visit(ctx.getChild(i)).toString());
            }
        }
        
        return prog;
    }
}
import java.util.*;

public class Program extends Expression {
    private List<Expression> expressions;
    
    public List<Expression> getExpressions() {
        return expressions;
    }
    
    public Program() {
        this.expressions = new ArrayList<>();
    }
    
    public void addExpression(Expression e) {
        expressions.add(e);
    }
}
java antlr4 parse-tree
© www.soinside.com 2019 - 2024. All rights reserved.