2012-09-21 103 views
2

我想使用ANTLR得到一个C + + AST,如果可能从我的C#代码库。使用ANTLR解析C++与C#

现在,基本的工作流程似乎很清楚:使用ANTLRWorks生成.cs词法分析器和分析器,将它们和ANTLR引用添加到C#项目中,为其提供C++源代码,并使用结果数据结构。

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

一个问题是,我不知道这是我使用的语法还是可用版本的问题......有许多不同版本的ANTLR,C#运行时和C#试图尝试每种组合的目标似乎是一个相当无望的任务。但是,目前的组合似乎工作正常,一个小例子语法出来只有一个错误(C#词法分析器中的“HIDDEN”需要更改为“隐藏”,就是这样),但C++解析器/词法分析器仍然给我很多编译器错误,主要涉及预处理器指令和数组声明。

有没有人设法解析C++与ANTLR生成的C#文件?有谁知道这应该如何工作?

+1

你需要多少C++?在ANTLR中解析C++ 98已经够糟糕了,而C++ 11并没有完全改进。 (例如处理'>>'现在更直观) – MSalters

回答

2

问题是在这两种语法中都有嵌入代码,而且代码是用C++编写的。嵌入式代码在复杂语法中非常常见,因此您需要在C#中查找用于解析C++的语法,而不是仅仅解析C++。作为一个方面说明,如果你能找到一个用Java解析C++的程序,你可以使用IKVM从C#中使用它。

+1

感谢您的回答,尽管这不是我真正希望的。这种嵌入式代码不会将分离语法和目标的整体思路过时吗? – Jay

+0

@Jay:您实际上可以为C++构建纯文法并解析它(狭义的“校验语法”并构建一个分析树),而不用通过“嵌入代码”攻击语法。请参阅http://stackoverflow.com/a/4173543/120163。作为一个实际的事情,纯粹的解析器是不够的,谷歌我的文章“解析后的生活”。在某些时候,人们必须将语法规则结合到某种类型的语义分析中(至少要构建符号表),并且“语义分析”不太可能被写入* your * selected,favorite,convenient-to-you语言(虽然Java,C#和C++的人都希望)... –

+0

@Jay:...所以要么你不得不放弃在方便的语言中获得工作分析器,和/或你已经接受调用解析的想法机器在另一个编程系统中实现。 (这有其自己的麻烦,因为其他编程系统为这项任务提供的机制可能实际上比你编码的要大得多,而且可能更好)。 –

0

我唯一看到的C++的ANTLR语法被其作者放弃是不完整的,他只是在尝试C++ 98(YMMV)。 C++ 11(以及真的,C++ 14)在这里并且更加复杂。建立一个生产C++是确实很难,除非你能得到一个经过测试的火,否则它可能不适用于真正的代码。

我建议您使用Clang,EDG C++前端或我们的DMS Software Reengineering Toolkit,它们都具有强大的C++解析器。如果你想操纵分析的C++来达到某种目的,你会需要比“纯粹”分析器更多的机器。