【问题标题】:ANTLR parser example with C++ grammar具有 C++ 语法的 ANTLR 解析器示例
【发布时间】:2018-02-28 19:52:40
【问题描述】:

我正在尝试使用 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++ 源文件的工作示例的任何指针都会很棒。

谢谢!

【问题讨论】:

  • C++ 语法不明确。尝试用纯语法解析它(没有外部特别帮助来消除歧义)将失败。这里使用的语法似乎没有任何这样的外部帮助。可能有可能对其进行修补(毕竟 Clang 一个 GCC 设法仅通过递归下降来解析 C++),但这样做的努力可能比您想象的要大得多。然后你会遇到预处理器代码。更多详情请见stackoverflow.com/questions/243383/…
  • 您好,我尝试做类似的事情,您能告诉我您使用什么库,以及您如何在 pom 中包含 -it 吗?

标签: java c++ parsing antlr4


【解决方案1】:

语法的入口点通常是以EOF 结尾的规则。在你的情况下,试试translationunit 规则:

ParseTree entryPoint = parser.translationunit();

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

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

【讨论】:

  • ... 如果不是这种情况(结束 n EOF),语法中的第一个解析器规则很可能是入口点(特别是如果它没有从任何地方调用)。另一方面,在我的一个语法中,我定义了六条以 EOF 结尾的其他规则(主要用于解析我的语言的子元素)。有时这很棘手...... :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
相关资源
最近更新 更多