Boost.Spirit 理论上/实际上可以用来解析 C++(0x) (或任何其他语言)吗?
理论上可以胜任这项任务吗?
它可以实际完成吗?生成的解析器是否具有足够的性能和输出(例如 LLVM IR 或 GCC 的 gimple)以集成到竞争编译器中?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
理论上可以胜任这项任务吗?
它可以实际完成吗?生成的解析器是否具有足够的性能和输出(例如 LLVM IR 或 GCC 的 gimple)以集成到竞争编译器中?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
对不起。我与它的作者交谈过,他说他不会让它完全解析 C++,但承认他接受它来解析某些不明确的结构。
所以这不再是答案!
<罢工>
我建议您看看scalpel。从其主页
还有
I'm sorry. I talked to its author, and he said he won't make it parse C++ fully, but admits that he accepts it to parse certain constructs as ambiguous.
So this is not an answer anymore!!
I recommend you to have a look at scalpel. From its homepage
And
不。对于大多数自动工具来说,C++ 太难解析,并且在实践中通常是通过手写解析器进行解析。
[编辑 2015 年 3 月 1 日:添加了“大多数”和“通常”。]
困难的问题包括:
A * B;
,它可以是 a 的定义类型为 A* 的变量 B 或只是两个变量 A 和 B 的乘法A<>
在哪里结束?通常用于解析表达式的“max-munch”规则在这里不起作用。vector>
其中>>
结束两个模板,仅使用一个标记很难做到这一点(并且允许中间有空格) 。但在1>>15
中不允许有空格。我敢打赌,这份清单还远未完成。
添加:语法可用,但不明确,因此作为 Spirit 等工具的输入无效。
2015 年 3 月 1 日更新:正如该领域的知名专家 Ira Baxter 在评论中指出的那样,有一些解析器生成器可以生成一个解析器,该解析器将生成完整的解析器森林。据我所知,选择正确的解析仍然需要一个语义阶段。我不知道有任何非商业解析器生成器可以对 C++ 语法执行此操作。有关详细信息,请参阅此答案。
No. C++ is too hard to parse for most automatic tools, and in practice usually is parsed by hand written parsers.
[Edit 1-Mar-2015: Added 'most' and 'usually'.]
Among the hard problems are:
A * B;
which could be either the definition of a variable B with typeA*
or just the multiplication of two variables A and B.A < B > C > D
Where does the templateA<>
end? The usual 'max-munch' rules for parsing expressions will not work here.vector<shared_ptr<int>>
where the>>
ends two templates, which is hard to do with only one token (and a space in between is allowed). But in1>>15
no space is allowed.And I bet that this list is far from complete.
Addition: The grammar is available, but is ambiguous and thus not valid as input to tools like Spirit.
Update 1-Mar-2015: As Ira Baxter, a well known expert in this field, points out in the comments, there are some parser generators that can generate a parser that will generate the full parser forest. As far as I know, selecting the right parse still requires a semantic phase. I'm not aware of any non-commercial parser generators that can do so for C++'s grammar. For more information, see this answer.
对于“任何其他语言”,我曾经尝试用 Spirit 创建一个 shell 脚本解析器。事实证明理论上是可行的(我相信它会起作用),但是在1 GB内存的机器上无法编译,所以最终我放弃了。
For "any other language", I once tried creating a shell script parser with Spirit. It turned out to be theoretically possible (I believe it would work), but it was not compilable on a machine with 1 GB memory, so eventually I gave up.