【问题标题】:Embedded scripting engine for DSL用于 DSL 的嵌入式脚本引擎
【发布时间】:2009-10-19 20:57:38
【问题描述】:

我正在开发一个需要嵌入式 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。它可以是孤立的,但也可以进行一些集成。

【问题讨论】:

  • 感谢您的 cmets,我将尽快检查未答复的,因为他们需要比其他人更深入的查看。
  • 再次感谢大家。我选择 Lua 是因为它真正可嵌入的工作方式和 Qt 绑定,尽管 QtScript/V8 也是不错的选择。对我来说,Python 看起来太难嵌入了。

标签: c++ qt dsl embedded-language


【解决方案1】:

那里有at least a few Qt-Lua bindings。 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++ 中。

【讨论】:

  • 现在我明白为什么 Lua 是游戏脚本中的热门选择了。它看起来非常强大,而且正如您所说,非常容易嵌入(这是一个很好的例子:cc.byexamples.com/20080607/how-to-embed-lua-51-in-c)。它也可以跨平台工作并且具有熟悉的语法(乍一看,类似于 Ruby,但我知道它不是)所以我不会失去在我的项目中采用它的任何功能。谢谢!
【解决方案2】:

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

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

【讨论】:

  • 这也是一个好点,但我与 QtScript 的方式相同。我想我可以在 Java/ECMAscript 上构建 DSL 并将其作为强制库提供。
【解决方案3】:

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

【讨论】:

  • 在询问之前,我查看了 QtScript,但没有找到在其上构建 DSL 的线索。
  • 如果你用谷歌搜索“javascript dsl”,你可能会找到一些有用的信息。
【解决方案4】:

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

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

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

【讨论】:

  • 我发现了一些关于在 TCL 上构建 DSL 的信息,但 Lua 看起来更好。还是谢谢!
【解决方案5】:

我从未尝试过,但有PyQt

【讨论】:

  • 谢谢,但 PyQt 只是对 Qt 库的绑定。我需要在 C++ 项目中嵌入一个脚本引擎,它允许在其上构建 DSL,并且如果可能的话,与 Qt 绑定。也许我可以嵌入python并在里面使用PyQt。
【解决方案6】:

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

【讨论】:

    【解决方案7】:

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

    【讨论】:

    • 非常有趣的选项,但我猜创建的 DSL 将错过为预先存在的嵌入式语言提供的任何基本功能(例如条件流),除非我故意实现它。我说的对吗?
    【解决方案8】:

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

    【讨论】:

      猜你喜欢
      • 2011-04-16
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多