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

问题描述:

我需要为C++ 14创建一个解析器。此解析器必须使用C++创建,以便实现遗留代码生成重用。我正在考虑使用ANTLR3来实现这个功能(因为ANTLR4还没有针对C++代码)。LL(*)解析器(如antlr3)可以解析C++吗?

我的疑问是,如果ANTLR3可以解析C++,因为它不使用像ANTLR4这样的Adaptive LL(*)算法。

+0

*“我需要为C++ 14创建解析器。”* ...为什么?另外,如果您真的需要这个,您是否探索LLVM及其功能? – Nawaz

+0

你确实意识到[C++的语法不受限制](http://*.com/questions/14589346/is-c-context-free-or-context-sensitive),没有上下文,对吧? – Cornstalks

+0

语法正确的输入可能会产生无效的C++代码:'void m(){m ++;}' – Rerito

大多数传统的解析器生成器不能生成解析器,该解析器将解析任意上下文无关语言的语法。它们可以解析的语法的限制经常引起解析器生成器类的名称: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解析器所做的;符号表信息用于强制解析器沿着正确的路径。

如果您选择构建自己的解析器的这个路径,无论您选择哪个解析器生成器,都会投入大量精力来获得工作解析器。 [曾在这里;做了这个]。这不是一个很好的方式来与任何你想要的任务激励这个解析器。

我建议你得到一个已经工作。 (我已经列出了两个,如果你愿意的话,你可以通过我的生物了解我们的解析器)。

这将大概给你一个工作分析器。然后你想用分析树来做一些事情,并且你会发现解析后的生活需要很多解析器不提供的机制。谷歌短语来找到我的论文关于这个话题或检查我的生物。

+0

谢谢你艾拉巴克斯特。我使用Bison来解析C++,但它不能在解析过程中访问语义谓词中的子节点信息。 ANTLR启用了这个功能,但是我最大的问题是解析算法LL(*)。我读到,这具有无限的前瞻性。我正在考虑尝试ANTLR。 –

+0

好吧,祝你好运。您是否真的考虑过取得成功所需的努力水平? –

+0

我认识到这将是一项艰苦的工作。但是,如果我取得成功,它将启动一系列研究和源到源转换。我的第一个目标是保存所有C++声明并将这些信息用于语义谓词以避免含糊不清。我已经有一个(几乎)用于C++的工作解析器(使用Bison开发),但是这不处理含糊不清(当解析器不知道标识符是否是类型/声明符等)。再次感谢您的回答,并为糟糕的英语感到抱歉。 –