|
锁定老贴子 主题: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 做一个翻译程序效果比较好。 |
|
| 返回顶楼 | |



