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

rub*_*nvb 19 c++ parsing boost boost-spirit c++11

这在理论上取决于任务吗?

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

Joh*_*itb 16

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

所以这不再是一个答案!!


我建议你去看一下手术刀.从它的主页

Scalpel代表s?source c?ode?一个?nalysis,?IBRE和p?ortabl?el?图书馆.这是一个C++库,旨在对任何给定的C++程序执行完整的语法和语义分析.

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

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

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

  • 更新:在我之间我问他正在做什么,他说他只是忽略了语法中的所有含糊之处:(所以我猜他的解析器不算作解析C++ -.- (2认同)

Sjo*_*erd 5

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

困难的问题包括:

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

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

补充:语法可用,但不明确,因此不能作为 Spirit 等工具的输入。

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

  • Spirit 完全能够通过语义动作进行上下文消歧。谁在投票赞成这种胡说八道? (6认同)
  • 解析和解释是两件不同的事情。您仍然可以在不知道 A 和 B 实际是什么的情况下解析“A * B”。 (3认同)