使用ANTLR用C#解析C++
Use ANTLR to parse C++ with C#
如果可能的话,我正在尝试使用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++,那么您将需要比"纯粹"的解析器更多的机制。
- 继承函数的重载解析
- 基类中的函数名称解析
- 提升精神:解析布尔表达式并简化为规范范式
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- gcc和c++17的过载解析失败
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 构造函数和转换运算符之间的重载解析
- 未解析的外部符号_MsiLocateComponentW@12.
- '尝试解析可变参数模板时无法推断出'T的模板参数
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 如何在 cpp 中解析此文件?
- 在C++中使用 gRPC 时未解析的外部符号
- IDE (CLion) 无法解析C++模板类型
- 配置文件解析器仅返回以前的值
- 增强精神解析器规则以检测语句中的特殊结尾
- 将向量解析<string>为字符串
- 使用 jsoncpp 解析 json 数组字符串
- 提升精神 x3 - 懒惰解析器
- boost::spirit::x3 中的通用解析器生成器