理论上是否可以胜任这项任务?
它是否可以实际完成,并且生成的解析器是否可以使用足够的性能和输出(例如,LLVM IR或GCC的gimple)来集成到竞争编译器中?
答案 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内存的机器上无法编译,所以最终我放弃了。