Boost.Spirit理论上/实际上可以用来解析C++(0x)(或任何其他语言)
Can Boost.Spirit be theoretically/practically used to parse C++(0x) (or any other language)?
理论上能胜任任务吗?
它是否可以实际完成,并且生成的解析器是否会以足够的性能和输出(例如,LLVM IR 或 GCC 的 gimple)用于集成到竞争编译器中?
对不起。我和它的作者谈过,他说他不会让它完全解析C++,但承认他接受它来解析某些结构是模棱两可的。
所以这不再是答案了!!
我建议你看看手术刀。从其主页
手术刀代表 source code analysis, l ibre and portablelibrary。 这是一个C++库,旨在对任何给定C++程序执行完整的语法和语义分析。
和
是什么让我认为手术刀可以被 Boost 接受
Scalpel 使用多个 Boost 库:Spirit、Wave、shared_ptr(现在在 C++0x 的 STL 中)、Optional 、Test 等。实际上,它只使用 Boost 库和 Boost 所需的C++标准库。
此外,Boost已经提供了一个基于Spirit的C++源代码预处理库:Wave。包括C++源代码分析库似乎是一种自然的演变。
大多数自动工具来说,C++号太难解析了,实际上通常由手写解析器解析。[编辑 2015 年 3 月 1 日:添加了"大多数"和"通常"。
其中的难题包括:
-
A * B;
可以是类型为A*
的变量 B 的定义,也可以是两个变量 A 和 B 的乘法。 -
A < B > C > D
模板A<>
在哪里结束?用于解析表达式的常用"max-mnoch"规则在这里不起作用。 -
vector<shared_ptr<int>>
>>
结束两个模板的地方,这很难只用一个令牌(并且允许在两者之间留出空格)。但在1>>15
不允许有空间。
我敢打赌,这份清单远非完整。
补充:语法是可用的,但模棱两可,因此不能作为 Spirit 等工具的输入。
2015 年 3 月 1 日更新:正如该领域的知名专家 Ira Baxter 在评论中指出的那样,有一些解析器生成器可以生成一个解析器,该解析器将生成完整的解析器森林。据我所知,选择正确的解析仍然需要一个语义阶段。我不知道有任何非商业解析器生成器可以为C++的语法做到这一点。有关详细信息,请参阅此答案。
对于"任何其他语言",我曾经尝试使用Spirit创建一个shell脚本解析器。事实证明,这在理论上是可行的(我相信它会起作用),但它无法在具有 1 GB 内存的机器上编译,所以最终我放弃了。
- 定义宏以将前缀 0x 添加到十六进制字符串文本
- 0x%08lx 格式说明符在 printf 语句到 cout
- 如何使系统在十六进制数之前打印 0x,在八进制数之前打印 0?
- -std=c++0x 导致在 boost 1.64 的情况下返回对临时的引用
- 将字符串转换为十六进制格式并将"0x "附加到十六进制值
- 使用 C++0x 编译生成文件
- 如何将 x 打印为 0x,其中 x 是整数C++
- Unix 宏在使用 -std=c++0x 标志编译时变得未定义
- 嵌套模板功能中的C 0x lambda参数
- 无法加载dll libglorycolx2010.dll.该应用程序未能启动,因为其并排配置不正确.Hresult:0x
- G-WAN cc1plus:错误:无法识别的命令行选项"-std=gnu++0x"
- 在 DirectXGame.exe 中0x00B84CD6出现未经处理的异常:0xC0000005:访问冲突读取位置0x
- C++0x线程没有加速
- 如何为 C++0x/11 和非 C++0x/11 制作标头
- Compiling c++0x for AVR
- C++中的 0x 和"\x"有什么区别?
- 小写 0x 与大写 iostream
- g++-std=c++0x及其兼容性
- arm-linux-gnueabihf-g++ 是否有可靠的 C++0x 支持?
- 为什么 mingw 4.4 说<random>需要 c++0x?