【问题标题】:Use ANTLR to parse C++ with C#使用 ANTLR 用 C# 解析 C++
【发布时间】:2012-09-13 16:02:08
【问题描述】:

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

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

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

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

但是,当前的组合似乎工作正常,一个小的示例语法只有一个错误(c# lexer 中的“HIDDEN”需要更改为“Hidden”,仅此而已),但是 C++ 解析器/词法分析器仍然给我很多编译器错误,主要是处理预处理器指令和数组声明。

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

【问题讨论】:

  • 您需要多少 C++?在 ANTLR 中解析 C++98 已经够糟糕的了,C++11 并没有完全改善。 (例如,>> 的处理现在更加直观)

标签: c# c++ parsing antlr


【解决方案1】:

问题在于两种语法中都嵌入了代码,并且代码是用 C++ 编写的。嵌入式代码在复杂的语法中很常见,所以需要在 C# 中找到解析 C++ 的语法,而不是仅仅解析 C++。附带说明一下,如果您能够找到在 Java 中解析 C++ 的工具,则可以使用 IKVM 从 C# 中使用它。

【讨论】:

  • 感谢您的回答,尽管这并不是我所希望的。这种嵌入式代码不会使分离语法和目标的整个想法过时吗?
  • @Jay:您实际上可以为 C++ 构建纯语法并对其进行解析(狭义的“检查语法”并构建解析树),而无需使用“嵌入式代码”破坏语法。见stackoverflow.com/a/4173543/120163。实际上,纯解析器是不够的,谷歌我关于“解析后的生活”的文章。在某些时候,必须将语法规则与某种类型的语义分析相结合(至少是为了构建符号表),而“语义分析”不太可能写在 你的 选择的、最喜欢的、方便你的语言(尽管 Java、C# 和 C++ 的人都希望)...
  • @Jay: ...所以要么你不得不放弃使用你方便的语言获得一个可以工作的解析器,和/或者你已经接受了调用在另一个编程系统中实现的解析器的想法。 (这有其自身的麻烦,因为其他编程系统为该任务提供的机器实际上可能比您正在编写的代码大得多,而且可能更擅长它)。
【解决方案2】:

我见过的唯一针对 C++ 的 ANTLR 语法被它的作者抛弃,因为它不完整,他只是在尝试 C++98 (YMMV)。 C++11(是的,确实是 C++14)就在这里,而且要复杂得多。构建一个生产 C++真的很难,除非你能得到一个已经过火测试的,否则它可能不适用于真实的代码。

我建议您使用 Clang、EDG C++ 前端或我们的 DMS 软件再工程工具包,它们都具有强大的 C++ 解析器。如果您想出于某种目的操作已解析的 C++,您将需要比“单纯的”解析器更多的机器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 2011-01-17
    相关资源
    最近更新 更多