我正在一个需要嵌入式DSL来满足其预期要求的项目。
DSL将基于用户定义的事件。这是所需语法的模型:
user-defined-event-1 {
// event body
}
user-defined-event-2 {
// event body
}
可能基于事件,我知道的最相似的语言是LSL (from Second Life)。
因此,在阅读了关于SO的其他类似问题之后,我想问一问C ++(我在Qt工作)上最好的可嵌入脚本引擎(Ruby,Lua,Python等),它允许我创建此DSL。
在我的项目中,我将测试脚本是否正确使用了DSL语法(至少定义了一个事件),并为用户提供了底层脚本引擎的全部功能,并在可能的情况下为用户提供了Qt。
不是嵌入式语言与Qt一起使用的要求。它可以隔离,但也可以进行一些集成也很好。
那里有at least a few Qt
-Lua bindings。 Lua可以执行您上面显示的语法;具体来说,Qt
表示Lua中的表(关联数组),如果仅将匿名表传递给函数,则不需要括号:
{}
Lua是否实际上是您应用程序的best,当然取决于您的应用程序。无论哪种方式,Lua都非常容易(IMO)嵌入到C或C ++中。
您可以通过用C ++编写的Google V8项目来查看可嵌入的javascript。
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> function LengthOfTable(t) print(#t) end
> LengthOfTable ({"a","b","c"})
3
> LengthOfTable {"a","b","c"}
3
Qt随http://code.google.com/apis/v8/intro.html脚本模块一起提供。它使用基于ECMAScript的语言(例如javascript)。
Tcl非常接近您建议的语法:
QtScript
proc定义一个过程,多余的{}大括号用于参数。在tcl shell中,可以逐行动态键入过程,复制和粘贴过程,或从文件中加载过程。也可以通过简单地重新加载它们来重新定义它们。
我从未尝试过,但是有proc user-defined-event-1 {} {
# event body
puts "Hello World"
}
。
我相信boost :: python很容易实现。我听说也有一些python-Qt解决方案。
您似乎对选择通用DSL有非常具体的要求。您可能要尝试使用通用DSL库(例如PyQt),而不是使用预先嵌入的语言。
要在应用程序中嵌入DSL,我建议Boost.Proto。多年来,我一直在使用ANTLR,最近一次使用的是ANTLR。您可能想尝试具有C ++运行时的版本4。由于与关键字emit发生冲突,第3版在Qt上存在问题。