2010-05-06 65 views
6

我想创建一个特定于域的语言作为增强的C++语言。我需要多为两种类型contructs的:部分解析C++的域特定语言

  • 专门类型的顶级结构或声明
  • 在代码结构,即加元进行功能调用或成语更容易

的语言将用于科学计算目的,并最终将被转换为纯C++。 C++已被选中,因为它似乎提供了一个很好的折衷:易用性,效率和广泛的库的可用性。

使用Flex和野牛先前尝试失败,原因是在C++语法的复杂性。现有的解析器仍然可以在某些构造上失败。所以我们想要重新开始,但要在更好的基础上。

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

+2

你可以请检查是否红clangs当前的C++的支持是对你不够好 - 他们的API看起来很有前途,应该是可扩展的。 – 2010-05-06 09:13:02

回答

0

如果你真的想要扩展C++,你需要一个完整的C++语法分析器加名和类型解析。正如你发现的那样,这很难。你最好的解决办法是获得一个现有的并修改它。

我们DMS Software Reengineering Toolkit是实现的langauge处理器的基础设施。它是 旨在支持构建工具,解析语言,进行转换,并吐出相同的语言(与增强代码)或不同的语言/方言。

DMS具有全C++ Front End,它解析C++,构建抽象语法树和符号表(例如,所有的名称和类型的分辨率的东西)。

的DMS/C++前端以源形式设置有DMS,以便它可以被定制以获得所需效果的种类为。您将DSL定义为C++前端的扩展,然后编写将您的特殊构造转换为“vanilla”C++构造的转换,然后再吐出可编译的结果。

DMS/C++已被用于各种各样的改造任务,包括那些参与扩展C++,如你所述,包括开展大型C++应用大规模重组任务。 (请参阅该网站的出版物)。

+0

“如果你真的想扩展C++,你需要一个完整的C++解析器加上名称和类型解析” - 不,不一定。解析出* augmented *结构就足够了。当然,这不需要扼杀其余的代码,但这并不需要具有完整的解析器。 – 2010-05-06 09:18:14

+0

事实上,它可能找到足够小的扩展,所以实际上你可以用Perl和正则表达式来实现。在实践中,很难找到有趣的C++扩展(例如OP的概念“特殊类型和声明”),这将允许您仅仅解析,特别是如果编写这样的声明会影响代码的其他部分。即便如此,你会发现解析是一项艰巨的任务;如果你试图解析*没有*名称和类型解析,你必须保留所有不明确的解析。 – 2010-05-06 09:22:03

+0

看起来非常好,但不幸的是,这只适用于Windows,这是我不使用的系统。 – PierreBdR 2010-05-06 09:23:20

-1

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

0

扩展C++的方法不是试图扩展语言,这将是非常困难的,可能会因为新的基本编译器版本实现新功能而中断,而是编写类库以支持您的问题域。自从该语言诞生以来,这就是C++编程的全部内容。

+0

的规模相同,这就是我开始的。但对于非C++程序员来说,结果仍然看起来很可怕。这就是为什么我现在想要在C++之上添加一个薄层来提高可读性(比如避免复杂的模板,添加一些在代码中发生的地道构造,或者用关键字替换一些函数调用,以便更好地提供句法)。 – PierreBdR 2010-05-06 09:26:54

+0

这并不完全正确。一些最好的基于C++的项目包含增强的C++ DSL。仅举几例:Qt中的MOC预处理器,LLVM中的tablegen DSL。 – 2010-05-06 09:31:07

3

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

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

这些都是完全符合C++库,它使用C++语法。

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

我会很乐意提供一些例子,如果你给了我们一些与:)

2

你可以尝试扩展一个开源艾尔莎C++解析器可以工作(现在是Mozilla的猪肉项目的一部分):

https://wiki.mozilla.org/Pork