代码之家  ›  专栏  ›  技术社区  ›  ConductedClever

ANTLR v4、JavaLexer和JavaParser返回null作为解析树

  •  8
  • ConductedClever  · 技术社区  · 7 年前

    我使用antlr v4提取java程序的解析树以用于其他目的。我从这个示例开始: ANTLR v4 visitor sample

    我已经测试了给定链接上的步骤,以检查它是否有效,以及一切是否正常:

    java Run
    a = 1+2
    b = a^2
    c = a+b*(a-1)
    a+b+c
    ^Z
    Result: 33.0
    

    |_Java.g4                                                               
    |_Java.tokens                                                           
    |_JavaBaseVisitor.java                                                  
    |_JavaLexer.java                                                        
    |_JavaLexer.tokens                                                      
    |_JavaParser.java                                                       
    |_JavaTreeExtractorVisitor.java                                         
    |_JavaVisitor.java           
    |_Run.java 
    

    还有跑步。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(); 树对象为null。

    (如果需要更多信息,请通知我)。

    2 回复  |  直到 7 年前
        1
  •  3
  •   Bill the Lizard    7 年前

    假设你在使用语法 here

    ParseTree tree = parser.compilationUnit();
    

    (对于任何不使用该语法的人,您都需要您命名的顶级解析器规则。)

        2
  •  1
  •   Maurice Perry    7 年前

    你不应该做:

        ParseTree tree = parser.input();