当前位置:  开发笔记 > 编程语言 > 正文

在Java中创建自然DSL的最佳工具是什么?

如何解决《在Java中创建自然DSL的最佳工具是什么?》经验,为你挑选了3个好方法。

几天前,我读了一篇博客文章(http://ayende.com/Blog/archive/2008/09/08/Implementing-generic-natural-language-DSL.aspx),其中作者讨论了使用.NET的通用自然语言DSL解析器.

在我看来,他的想法中很棒的部分是使用与句子相同的名称对文本进行解析和匹配.

举个例子,以下几行:

Create user user1 with email test@email.com and password test
Log user1 in
Take user1 to category t-shirts
Make user1 add item Flower T-Shirt to cart
Take user1 to checkout

将使用"已知"对象的集合进行转换,这些对象将获取解析结果.一些示例对象将是(使用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类将是一个匹配(显然因为它是"创建用户"的串联),并且由于它在构造函数上采用了一个参数,因此解析器将"user1"作为用户参数.

之后,解析器将识别下一部分"with email"也与方法名称匹配,并且由于该方法采用参数,因此它将解析"test@email.com"作为电子邮件参数.

我想你现在明白了,对吧?至少对我来说,一个非常明确的应用是允许应用程序测试人员用自然语言创建"测试脚本",然后将句子解析为使用JUnit检查应用程序行为的类.

我想听听有关使用Java编写此类解析器代码的工具或资源的想法,提示和意见.更好的是,如果我们可以避免使用复杂的词法分析器,或像ANTLR这样的框架,我认为可能会使用锤子来杀死苍蝇.

更重要的是,如果有人为此启动一个开源项目,我肯定会感兴趣.



1> Joe Skora..:

考虑到lexing和解析的复杂性,我不知道我是否想要手动编写所有这些代码. ANTLR并不难以拾取,我认为值得根据您的问题进行调查. 如果您使用解析语法从输入构建和抽象语法树,那么很容易用树语法处理该AST.树语法可以轻松处理执行您描述的过程.

你会在很多地方找到ANTLR,包括Eclipse,Groovy和Grails. 最终的ANTLR参考甚至可以非常简单地快速掌握基础速度.

我有一个项目,必须在今年早些时候处理一些用户生成的查询文本.我开始尝试手动处理它,但很快就变得势不可挡.我用了几天的时间来提高ANTLR的速度,并在几天内运行了我的语法和处理器的初始版本.对需求的后续更改和调整会导致任何自定义版本死亡,但是一旦我启动并运行ANTLR语法,就需要相对较少的调整工作.

祝好运!


花了几天的时间让我的脑袋缠绕在ANTLR上,从未接受过lexer/parser/compile课程.我很高兴我这样做,因为它将来会一次又一次有用.帕尔写了一篇ANTLR,所以这本书是一本很好的资源,也是一本很好的书面介绍.

2> Michael Borg..:

如果你称之为"自然语言",那你就是在欺骗自己.它仍然是一种编程语言,只是一种试图模仿自然语言的语言 - 我怀疑它一旦你进入实现细节就会失败.为了明确说明,你必须对语法施加限制,这会限制那些被认为他们正在写"英语"的用户.

DSL的优点是(或者应该是,无论如何),它在问题域方面简单明了,但功能强大.模仿自然语言是次要问题,实际上可能会对这些主要目标产生反作用.

如果有人太愚蠢或者缺乏编程所需的正式严谨思考的能力,那么模仿自然的编程语言就不会让他们神奇地变成程序员.

当COBOL被发明时,有些人认为在10年内对专业程序员的需求为零,因为COBOL"像英语",任何需要软件的人都可以自己编写.我们都知道这是如何运作的.



3> Fabian Steeg..:

您可能需要考虑Xtext,它在内部使用ANTLR并执行一些很好的操作,例如为DSL自动生成编辑器.

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有