我需要为C ++ 14创建一个解析器。必须使用C ++创建此解析器,以便重用遗留代码。我想用ANTLR3来实现它(因为ANTLR4还没有针对C ++代码)。
我怀疑ANTLR3是否可以解析C ++,因为它不使用像ANTLR4这样的自适应LL(*)算法。
答案 0 :(得分:4)
大多数经典解析器生成器无法生成解析器,该解析器将解析任意上下文无关语言的语法。他们可以解析的语法的限制经常会产生解析器生成器类的名称: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解析器所做的事情;符号表信息用于强制解析器沿正确的路径行进。
如果您选择沿着这条构建自己的解析器的路径,无论您选择哪种解析器生成器,您都将投入大量精力来获得有效的解析器。 [曾在这里;完成这个]。这不是一个很好的方式来继续你的预期任务激励这个解析器。
我建议你找一个已经有效的。 (我已经列出了两个;如果你愿意的话,你可以通过我的生物找到我们的解析器。)
这可能会让你找到一个有效的解析器。然后你想用解析树做一些事情,你会发现Life After Parsing需要很多解析器都没有提供的机制。谷歌这句话可以找到关于这个主题的论文或检查我的生物。