使用ANTLR用C#解析C++

Use ANTLR to parse C++ with C#

本文关键字:解析 C++ ANTLR 使用      更新时间:2023-10-16

如果可能的话,我正在尝试使用ANTLR从我的C#代码库中获得C++AST。

现在,基本的工作流程对我来说似乎很清楚:使用ANTLRWorks生成.cs-lexer和解析器,将它们和ANTLR引用添加到C#项目中,给它一个C++源,处理生成的数据结构。

然而,我已经在第二步失败了。我从下载了C++语法http://www.antlr.org/grammar/list(我尝试了Aurelian Melite的"C++语法"和Ramin Zaghi的"ANTLR 3.2的C++语法和代码跟踪器"),并通过在语法选项中设置"language=CSharp3;"生成了C#的词法分析器和语法分析器。然而,我无法编译包含解析器和lexer文件的C#项目。

问题是,我不知道这是我使用的语法问题还是可用的版本问题。。。ANTLR、C#运行时和C#目标有很多不同的版本,尝试每种组合似乎都是一项毫无希望的任务。

然而,当前的组合似乎运行良好,一个小的语法示例只出现了一个错误(c#lexer中的"HIDDEN"需要更改为"HIDDEN",仅此而已),但c++解析器/lexer仍然给我带来了很多编译器错误,主要是处理预处理器指令和数组声明。

有人用ANTLR生成的C#文件解析过C++吗?有人知道这是怎么回事吗?

问题是在这两种语法中都嵌入了代码,而这些代码是用C++编写的。嵌入式代码在复杂语法中非常常见,因此您需要找到一种语法来解析C#中的C++,而不仅仅是解析C++。顺便说一句,如果你能找到一个在Java中解析C++的,你可以使用IKVM从C#中使用它。

我见过的唯一一个C++的ANTLR语法被作者认为是不完整的,他只是在尝试C++98(YMMV)。C++11(事实上,C++14)在这里,而且要复杂得多。构建一个生产C++真的很难,除非你能得到一个经过火测试的C++,否则它可能无法在真正的代码上工作。

我建议您使用Clang、EDG C++前端或我们的DMS软件重组工具包,所有这些都有强大的C++解析器。如果您想出于某种目的操作解析后的C++,那么您将需要比"纯粹"的解析器更多的机制。