使用C ++语法

时间:2017-09-19 22:07:28

标签: java c++ parsing antlr4

我尝试使用ANTLR来解析C ++源代码,使用ANTLR C++ grammar file

生成词法分析器,解析器和侦听器(CPP14BaseListener.java,CPP14Lexer.java,CPP14Listener.java,CPP14Parser.java)后,尝试以这种方式在C ++文件上运行它:

private void parseCppFile(String file) throws IOException {
    String p1 = readFile(new File(file), Charset.forName("UTF-8"));
    System.out.println(p1);
    // Get our lexer
    CPP14Lexer lexer = new CPP14Lexer(new ANTLRInputStream(p1));
    // Get a list of matched tokens
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    // Pass the tokens to the parser
    CPP14Parser parser = new CPP14Parser(tokens);
    // Walk it and attach our listener
    ParseTreeWalker walker = new ParseTreeWalker();
    // Specify our entry point
    ParseTree entryPoint = null;//TODO: what is the entry point?
    walker.walk(new CPP14BaseListener(), entryPoint);
}

我的问题是 - 哪个CPP14Parser生成的方法用于获取解析文件的入口点? (见TODO评论)。

或者,显示如何解析C ++源文件的工作示例的任何指针都会很棒。

谢谢!

1 个答案:

答案 0 :(得分:1)

语法的入口点通常是以git branch -a结尾的规则。在您的情况下,请尝试EOF规则:

translationunit

如果人们不阅读评论,我会在我的回答中添加Mike的值得注意的评论:

  

...如果不是这种情况(结束n EOF),则语法中的第一个解析器规则是入口点(特别是如果它不是从任何地方调用的话)。另一方面,在我的一个语法中,我定义了六个以EOF结尾的其他规则(主要用于解析我语言的子元素)。有时它很棘手......: - )