部分解析C ++以获取特定于域的语言

时间:2010-05-06 09:07:03

标签: c++ parsing code-generation dsl

我想创建一个特定于域的语言作为扩充的C ++语言。我将主要需要两种类型的结构:

  • 专门类型或声明的顶级构造
  • 代码内构造,即添加原语以使函数调用或成语更容易

该语言将用于科学计算目的,并最终将被翻译成普通的C ++。选择C ++似乎提供了一个很好的折衷方案:易用性,效率和各种库的可用性。

由于C ++语法的复杂性,之前使用flex和bison的尝试失败了。现有的解析器仍然可能在某些构造上失败。所以我们想重新开始,但是要有更好的基础。

你知道类似的项目吗?如果你试图这样做,你会使用什么工具?主要陷阱是什么?你会在语法方面有建议吗?

5 个答案:

答案 0 :(得分:3)

有许多(聪明的)尝试在C ++语言中使用特定于域的语言。

域特定嵌入式语言通常称为 DSEL 。例如,您可以查找Boost.Spirit语法或Boost.rdb(在增强库中)。

这些是完全兼容的C ++库,它们使用C ++语法。

如果您想隐藏一些复杂性,可以添加几个宏。

如果你给我们一些合作的话,我很乐意提供一些例子:)

答案 1 :(得分:2)

您可以尝试扩展开源Elsa C ++解析器(它现在是Mozilla Pork项目的一部分):

https://wiki.mozilla.org/Pork

答案 2 :(得分:0)

如果你真的想扩展C ++,你需要一个完整的C ++解析器以及名称和类型解析。你已经发现,这很难。您最好的解决方案是获取现有的并进行修改。

我们的DMS Software Reengineering Toolkit是用于实现语言处理器的基础架构。它是 旨在支持构建解析语言,执行转换以及吐出相同语言(使用增强代码)或使用不同语言/方言的工具。

DMS有一个完整的C++ Front End,它解析C ++,构建抽象语法树和符号表(例如,所有名称和类型解析的东西)。

DMS / C ++前端以源代码形式提供DMS,因此可以自定义以实现您想要的效果。您将DSL定义为C ++前端的扩展,然后编写将特殊构造转换为“vanilla”C ++构造的转换,然后吐出可编译的结果。

DMS / C ++已被用于各种各样的转换任务,包括如您所述的那些涉及扩展C ++的转换任务,以及包含对大型C ++应用程序进行大规模重组的任务。 (参见该网站的出版物)。

答案 3 :(得分:0)

扩展C ++的方法不是尝试扩展语言,这将非常困难,并且可能会随着新的基本编译器版本实现新功能而中断,但是编写类库以支持您的问题域。自语言开始以来,这就是C ++编程的全部内容。

答案 4 :(得分:-1)

为了解决你的第一个问题,也许你可以使用C ++ 0x新功能“初始化列表”和“用户定义的litterals”,避免使用新的解析器。他们也可能帮助第二颗子弹。