论坛首页 Ruby版 DSL

Ruby DSL

浏览 8492 次
锁定老贴子 主题:Ruby DSL
该帖已经被评为良好帖
作者 正文
时间:2006-09-25
raimundox 写道
我们项目已经使用自制QA Testing DSL一段时间了,第一版是用ruby dsl实现的,但是应用效果不好,现在改用antlr + reflection + jsr 223 scripting api实现的jvm脚本.
脚本大致是这个样子的:

happy path begin
user login goodhope as 'a@a.com' with password 'password'.
user goes to holding area of game 'MURed'.
assert could see 'some text' on top of this page.
assert that items are shown as a list.
user selects 2 items 1 pet and 300 money.
user packs those items to a bundle.
assert should show a confirm page.
assert bundle title is 'some thing'.
end

语法是简化且修改过的smalltalk语法,去掉了keyword message的':',允许在方法名里是用空格。在parser的实现上我采用了自己一直想尝试的一种作法,我称之为literal white space,也就是像'that' 'this' 'thoes' 'a' 'an'这类的单词和空白等价,可以写出但更接近自然语言的代码。

我们创造了一种叫做agile dsl refining的dsl构造方法,ruby dsl成为一个很好的kick off工具,但是最终dsl被实现成什么样子,这个还是要看项目的需要了,不一定就是ruby dsl。


看了代码有点理解 Antlr + Reflection + JSR 223 Script API 的含义了。
语法,词法层面应该还是 Antlr 做了一下分析代码生成,然后我觉得应该是一个翻译的过程,可能是 Syntax-Direct 到一种脚本语言去执行,毕竟有这么多的脚本语言可以使用,没必要去自己从头实现一份。

个人认为就是一个大的 API 集合,一个类似自然语言的语言去使用这个有限的 API 集合,毕竟这样一来让用户可以不需要学习一门通用编程语言。

回白衣:其实 Antlr 并不复杂,比编译原理这本书讲的东西具体的多。其实从头自己实现一个解释器工作量太大,很多时候用 Antlr 做一个翻译程序效果比较好。
   
0 请登录后投票
论坛首页 Ruby版 DSL

跳转论坛:
JavaEye推荐