Boost.Spirit理论上/实际上可以用来解析C++(0x)(或任何其他语言)

Can Boost.Spirit be theoretically/practically used to parse C++(0x) (or any other language)?

本文关键字:0x C++ 语言 其他 任何 理论上 Spirit 实际上 Boost      更新时间:2023-10-16

理论上能胜任任务吗?

它是否可以实际完成,并且生成的解析器是否会以足够的性能和输出(例如,LLVM IR 或 GCC 的 gimple)用于集成到竞争编译器中?

对不起。我和它的作者谈过,他说他不会让它完全解析C++,但承认他接受它来解析某些结构是模棱两可的。

所以这不再是答案了!!


我建议你看看手术刀。从其主页

手术刀代表 source code analysis, l ibre and portablelibrary。 这是一个C++库,旨在对任何给定C++程序执行完整的语法和语义分析。

是什么让我认为手术刀可以被 Boost 接受

Scalpel 使用多个 Boost 库:Spirit、Wave、shared_ptr(现在在 C++0x 的 STL 中)、Optional 、Test 等。实际上,它只使用 Boost 库和 Boost 所需的C++标准库。

此外,Boost已经提供了一个基于Spirit的C++源代码预处理库:Wave。包括C++源代码分析库似乎是一种自然的演变。

对于

大多数自动工具来说,C++号太难解析了,实际上通常由手写解析器解析。[编辑 2015 年 3 月 1 日:添加了"大多数"和"通常"。

其中的难题包括:

  • A * B;可以是类型为 A* 的变量 B 的定义,也可以是两个变量 A 和 B 的乘法。
  • A < B > C > D 模板A<>在哪里结束?用于解析表达式的常用"max-mnoch"规则在这里不起作用。
  • vector<shared_ptr<int>> >>结束两个模板的地方,这很难只用一个令牌(并且允许在两者之间留出空格)。但在1>>15不允许有空间。

我敢打赌,这份清单远非完整。

补充:语法是可用的,但模棱两可,因此不能作为 Spirit 等工具的输入。

2015 年 3 月 1 日更新:正如该领域的知名专家 Ira Baxter 在评论中指出的那样,有一些解析器生成器可以生成一个解析器,该解析器将生成完整的解析器森林。据我所知,选择正确的解析仍然需要一个语义阶段。我不知道有任何非商业解析器生成器可以为C++的语法做到这一点。有关详细信息,请参阅此答案。

对于"任何其他语言",我曾经尝试使用Spirit创建一个shell脚本解析器。事实证明,这在理论上是可行的(我相信它会起作用),但它无法在具有 1 GB 内存的机器上编译,所以最终我放弃了。