c++ - LL(*) 解析器(如antlr3)可以解析C++吗?

标签 c++ parsing antlr antlr4 antlr3

我需要创建一个 C++ 14 解析器。该解析器必须使用 C++ 创建,以便能够重用遗留代码生成。我正在考虑使用 ANTLR3 来实现这一点(因为 ANTLR4 还不针对 C++ 代码)。

我怀疑 ANTLR3 是否可以解析 C++,因为它不像 ANTLR4 那样使用自适应 LL(*) 算法。

最佳答案

大多数经典的解析器生成器无法生成解析器来解析任意上下文无关语言的语法。它们可以解析的语法的限制通常会产生解析器生成器类的名称:LL(k)、LALR...ANTLR3 本质上是 LL; ANTLR4 更好,但仍然不是上下文无关的。

Earley、GLR 和 GLL 解析器生成器可以解析上下文无关语言,但有时成本很高。在实践中,Earley 往往相当慢(但请参阅与 Perl6 一起使用的 MARPA 解析器生成器,我理解它是 Earley 的变体,据称速度相当快)。 GLR 和 GLL 似乎可以生成具有合理性能的工作解析器。

我的公司已经使用 GLR 为真实语言构建了大约 40 个解析器,包括所有 C++14,因此我对 GLR 的实用性很有信心。

当谈到解析 C++ 时,您处于一个完全不同的世界,主要是因为 C++ 解析似乎依赖于同时收集符号表信息。 (It isn't really necessary to do that if you can parse context-free).

如果你愿意努力奋斗,你也许可以让 ANTLR4(甚至 ANTLR3)解析 C++。本质上,您要做的就是构建一个解析器,它接受太多内容[通常是由于解析器生成器类的限制],然后使用临时方法去除多余的内容。这本质上就是手写的 GCC 和 Clang 解析器所做的事情;符号表信息用于强制解析器走上正确的路径。

如果您选择走这条构建自己的解析器的道路,无论您选择哪个解析器生成器,您都将投入大量的精力来获得一个可用的解析器。 [曾在这里;做了这个]。无论您的预期任务是什么,这都不是一个好方法来激发这个解析器。

我建议您购买一个已经可以使用的产品。 (我已经列出了两个;如果您愿意,您可以通过我的简历了解我们的解析器)。

这可能会给你留下一个可以工作的解析器。然后你想对解析树做一些事情,你会发现解析后的生活需要很多解析器不提供的机制。谷歌这个短语来找到我关于这个主题的文章或检查我的简历。

关于c++ - LL(*) 解析器(如antlr3)可以解析C++吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37505776/

相关文章:

parsing - Xtext 可以用于解析通用编程语言吗?

java - 如何在调试时暂停自定义解释器?

java - ANTLR 的基本帮助

c++ - 使用 C++ 将整数写入二进制文件?

c++ - 双缓冲时如何掩盖旧文本? - Win32 C++

ruby - 解析 ruby​​ 上的日志文件

php - 是否可以从 PHP 检查 PHP 文件语法?

c++ - 我的函数不接管其他函数的变量值

c++ - 函数模板规范

c# - 如何通过 XML 中的 id 获取节点?