LL(*)解析器(比如antlr3)能解析C++;? 我需要创建一个解析器到C++ 14。必须使用C++来创建这个解析器,以便实现遗留代码生成重用。我想用ANTLR3实现这个(因为ANTLR4还没有针对C++代码)。 我的疑问是,如果ANTLR3可以解析C++,因为它不使用自适应的LL(*)算法,如ANTLR4./P>> P>大多数经典的分析器生成器不能生成语法分析器,它将解析一个任意上下文无关语言的语法。它们可以解析的语法的限制常常导致解析器生成器类的名称:LL(k)、LALR、。。。ANTLR3本质上是LL;ANTLR4更好,但仍然不是上下文无关的

LL(*)解析器(比如antlr3)能解析C++;? 我需要创建一个解析器到C++ 14。必须使用C++来创建这个解析器,以便实现遗留代码生成重用。我想用ANTLR3实现这个(因为ANTLR4还没有针对C++代码)。 我的疑问是,如果ANTLR3可以解析C++,因为它不使用自适应的LL(*)算法,如ANTLR4./P>> P>大多数经典的分析器生成器不能生成语法分析器,它将解析一个任意上下文无关语言的语法。它们可以解析的语法的限制常常导致解析器生成器类的名称:LL(k)、LALR、。。。ANTLR3本质上是LL;ANTLR4更好,但仍然不是上下文无关的,c++,parsing,antlr,antlr4,antlr3,C++,Parsing,Antlr,Antlr4,Antlr3,Earley、GLR和GLL解析器生成器可以解析上下文无关语言,有时成本很高。实际上,Earley的速度往往相当慢(但请参阅Perl6使用的MARPA解析器生成器,据我所知,它是Earley的一个变体,据称相当快)。GLR和GLL似乎可以生成性能合理的工作解析器 我的公司已经为使用GLR的真实语言构建了大约40个解析器,包括所有C++14,因此我对GLR的实用性充满信心 当解析C++时,你在另一个世界,主要是因为C++解析似乎依赖于同时收集符号表信息。p> 你可能会让ANTLR4(甚至ANTLR

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

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

当解析C++时,你在另一个世界,主要是因为C++解析似乎依赖于同时收集符号表信息。p> <>你可能会让ANTLR4(甚至ANTLR3)解析C++,如果你愿意努力地克服它。本质上,您要做的是构建一个接受太多内容的解析器(通常是由于解析器生成器类的限制),然后使用特殊方法去除多余的内容。这基本上就是手写GCC和Clang解析器所做的;符号表信息用于强制解析器沿着正确的路径前进

如果您选择构建自己的解析器,无论您选择哪种解析器生成器,您都将投入大量精力来获得一个工作的解析器。[来过这里;做过这件事]。这并不是一个好方法,无法继续执行任何您想要的任务来激励解析器

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


这可能会给您留下一个可用的解析器。然后你想对解析树做些什么,你会发现解析后的生活需要很多解析器没有提供的机器。“谷歌”这个短语是为了找到我的文章,或者检查我的BIO。< /P>“我需要创建一个解析器到C++ 14。”为什么?此外,如果你真的需要这个,你是否探索LLVM及其能力?你应该意识到,不是上下文无关的,正确的,语法正确的输入会产生无效的C++代码:<代码>无效(),{M+++;} @ ReRito:几乎所有的分析者都接受“太多”。(例如,看起来合法但不是由于上下文约束的程序,有时甚至是由于特定解析机制不遵守的语法约束)。这意味着在“原始”解析之后,解析引擎必须进行进一步检查(例如,示例的类型检查)以消除“太多”请看我的解析C++和类型检查的答案:谢谢Ira Baxter。我用BySon解析C++,但是它不能在解析过程中访问语义谓词中的子节点信息。ANTLR启用这个,但是我的最大问题是关于解析算法LL(*)。。我读到这有无限的前瞻性。我正在考虑尝试ANTLR。好吧,祝你好运。你真的考虑过取得成功所需的努力程度吗?我承认这将是一项艰苦的工作。但是,如果我取得成功,它将使一组研究和源到源转换成为可能。我的第一个目标是拯救所有人C++声明,并使用语义谓词中的这些信息来避免歧义。我已经有(几乎)工作的C++分析器(使用BySon开发),但是这不处理歧义(当解析器不知道标识符是类型/声明器……)。再次感谢你的回答,对糟糕的英语感到抱歉。我不知道你是否检查过我的BIO。我已经建立了一个工具,可以将源到源转换应用到C++,它处理了所有的全名解析的模糊性。大多数用户不喜欢这个工具是商业化的。[在这方面,我们大概有10年的工程经验,而且这种工程并不便宜]。如果你建立另一个商业工具,你不会有更好的表现;我欢迎竞争,因为它表明这个想法是社区可以接受的。你可能正在考虑建立一个免费工具;你从哪里获得这样做的资源?