【发布时间】:2008-09-27 19:56:12
【问题描述】:
几天前,我阅读了一篇博文 (http://ayende.com/Blog/archive/2008/09/08/Implementing-generic-natural-language-DSL.aspx),其中作者讨论了使用 .NET 的通用自然语言 DSL 解析器的想法。
在我看来,他的想法的绝妙之处在于,文本被解析并与使用与句子名称相同的类匹配。
以如下几行为例:
使用电子邮件 test@email.com 和密码 test 创建用户 user1 登录用户 1 将 user1 带到 T 恤分类 让 user1 将商品 Flower T-Shirt 添加到购物车 带 user1 结帐将使用“已知”对象的集合进行转换,该集合采用解析结果。一些示例对象将是(以我的示例使用 Java):
public class CreateUser {
private final String user;
private String email;
private String password;
public CreateUser(String user) {
this.user = user;
}
public void withEmail(String email) {
this.email = email;
}
public String andPassword(String password) {
this.password = password;
}
}
因此,在处理第一句话时,CreateUser 类将是一个匹配项(显然是因为它是“create user”的串联),并且由于它在构造函数上接受一个参数,因此解析器会将“user1”作为用户参数。
之后,解析器将识别下一部分“with email”也匹配一个方法名称,并且由于该方法带有一个参数,它会将“test@email.com”解析为电子邮件参数。
我想你现在明白了吧?至少对我而言,一个非常明确的应用是允许应用程序测试人员用自然语言创建“测试脚本”,然后将句子解析为使用 JUnit 来检查应用程序行为的类。
我想听听关于可以使用 Java 编写此类解析器的工具或资源的想法、提示和意见。如果我们能避免使用复杂的词法分析器或像 ANTLR 这样的框架,那就更好了,我认为这可能会用锤子杀死苍蝇。
除此之外,如果有人愿意为此启动一个开源项目,我肯定会感兴趣。
【问题讨论】:
-
类似于 Glurk 的回答,因此作为评论:如果您寻找可执行的“自然”语言规范,您应该尝试 Cucumber (cukes.info)。与 JRuby(和 RSpec)一起,您可以将它用于基于 Java 的 BDD (behaviour-driven.org)。替代品包括 EasyB 和 JBehave。
-
什么是 DSL?是相似语言的消歧吗?参见 corporavm.uni-koeln.de/vardial/sharedtask.html