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

发布于 2024-11-09 01:09:17 字数 94 浏览 0 评论 0 原文

理论上可以胜任这项任务吗?

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

Is it theoretically up to the task?

Can it be done practically and would the resulting parser be used with sufficient performance and output (say, LLVM IR or GCC's gimple) to be integrated in a competing compiler?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

纸伞微斜 2024-11-16 01:09:17

对不起。我与它的作者交谈过,他说他不会让它完全解析 C++,但承认他接受它来解析某些不明确的结构。

所以这不再是答案!


<罢工>
我建议您看看scalpel。从其主页

Scalpel 代表s来源c颂歌a分析、l ibre 和pel图书馆。这是一个 C++ 库,旨在对任何给定的 C++ 程序执行完整的语法和语义分析。

还有

<罢工>

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

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

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


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

Scalpel stands for source code analysis, libre and portable library. This is a C++ library which aims to perform full syntax and semantic analysis of any given C++ program.

And

What makes me think Scalpel could be accepted into Boost

Scalpel uses itself several Boost libraries: Spirit, Wave, shared_ptr (now in C++0x's STL), Optional, Test, etc.. Actually, it exclusively uses Boost libraries and the C++ standard library, which is required by Boost.

Besides, Boost already provides a Spirit-based C++ source code preprocessing library: Wave. Including a C++ source code analysis library seems to be a natural evolution.

柠檬 2024-11-16 01:09:17

不。对于大多数自动工具来说,C++ 太难解析,并且在实践中通常是通过手写解析器进行解析。
[编辑 2015 年 3 月 1 日:添加了“大多数”和“通常”。]

困难的问题包括:

  • A * B;,它可以是 a 的定义类型为 A* 的变量 B 或只是两个变量 A 和 B 的乘法
  • 。 B> C> D 模板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 type A* or just the multiplication of two variables A and B.
  • A < B > C > D Where does the template A<> 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 in 1>>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.

善良天后 2024-11-16 01:09:17

对于“任何其他语言”,我曾经尝试用 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文