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

时间:2011-05-19 19:29:29

标签: c++ parsing boost c++11 boost-spirit

理论上是否可以胜任这项任务?

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

3 个答案:

答案 0 :(得分:16)

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

所以这不再是答案!!


<击> 我建议你看一下scalpel。从其主页

  

Scalpel代表 s ?来源 c ?ode? a ?分析, l ?ibre和 p ?ortabl? e ?的?ibrary。这是一个C ++库,旨在对任何给定的C ++程序执行完整的语法和语义分析。

并且

<击>   

是什么让我觉得Scalpel可以被接受为Boost

     

Scalpel使用了几个Boost库:Spirit,Wave,shared_ptr(现在在C ++ 0x的STL中),可选,测试等。实际上,它专门使用Boost库和C ++标准库,这是Boost所需要的

     

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

答案 1 :(得分:4)

没有。 C ++很难解析大多数自动工具,实际上通常由手写解析器解析。 [编辑2015年3月1日:添加'最多'和'通常'。]

其中的难题是:

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

我敢打赌,这份清单还远未完成。

添加:语法可用,但含糊不清,因此无法作为Spirit等工具的输入。

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

答案 2 :(得分:2)

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