3

我正在开发一个需要嵌入式 DSL 来满足其预期要求的项目。

DSL 将基于用户定义的事件。这是所需语法的模型:

user-defined-event-1 {
    // event body
}

user-defined-event-2 {
    // event body
}

可能,我所知道的基于事件的最相似的语言是LSL(来自 Second Life)

因此,在阅读了关于 SO 的其他类似问题之后,我想询问 C++(我在 Qt 中工作)上最好的可嵌入脚本引擎(Ruby、Lua、Python 等),它允许我创建这个 DSL。

在我的项目中,我会测试脚本是否正确使用了 DSL 语法(至少定义了一个事件),并为用户提供底层脚本引擎的所有功能,如果可能的话,Qt。

嵌入式语言不需要使用 Qt。它可以是孤立的,但也可以进行一些集成。

4

8 回答 8

3

那里至少有一些Qt-Lua 绑定。Lua 可以在某种程度上执行您上面显示的语法;具体来说,{}表示 Lua 中的一个表(关联数组),如果您只是将匿名表传递给函数,则不需要括号:

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

Lua 是否真的适合你的应用程序,当然取决于你的应用程序。无论哪种方式,Lua 都非常容易(IMO)嵌入到 C 或 C++ 中。

于 2009-10-19T21:03:36.153 回答
1

您可以通过 Google 的 V8 项目查看可嵌入的 javascript,该项目是用 C++ 编写的。

http://code.google.com/apis/v8/intro.html

于 2009-10-19T21:11:42.450 回答
1

Qt 带有QtScript脚本模块。它使用基于 ECMAScript 的语言(如 javascript)。

于 2009-10-19T21:22:00.687 回答
1

Tcl 非常接近您建议的语法:

proc user-defined-event-1 {} {
# event body
puts "Hello World"
}

proc 定义了一个过程,额外的 {} 大括号用于参数。在 tcl shell 中,过程可以逐行动态输入、复制和粘贴,或从文件加载。也可以通过简单地重新加载它们来重新定义它们。

于 2009-10-19T23:09:48.427 回答
0

我从未尝试过,但有PyQt

于 2009-10-19T21:05:09.317 回答
0

我相信 boost::python 很容易实现。我听说也有一些 python-Qt 解决方案。

于 2009-10-19T21:09:15.077 回答
0

您似乎对选择通用 DSL 有非常具体的要求。您可能想尝试通用 DSL 库(例如Boost.Proto)而不是现有的嵌入式语言。

于 2009-10-19T21:17:20.900 回答
0

为了在你的应用程序中嵌入 DSL,我推荐ANTLR。多年来我一直在使用 ANTLR,最新的是在Cassandra 的 JDBC 驱动程序中。您可能想尝试具有 C++ 运行时的版本 4。版本 3 在 Qt 与关键字 emit 的冲突中存在问题。

于 2013-05-01T07:09:11.793 回答