在Java中创建自然DSL的最佳工具是什么?[已关闭]

2022-09-02 23:09:50

几天前,我读了一篇博客文章(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

考虑到词法和解析的复杂性,我不知道我是否想手动编写所有这些代码。ANTLR并不难获得,我认为根据您的问题值得研究。如果您使用解析语法从输入中构建和抽象语法树,则使用树语法处理该AST非常容易。树语法可以轻松处理执行您描述的过程。

你会在很多地方找到ANTLR,包括Eclipse,Groovy和Grails。Definitive ANTLR Reference甚至使相当快速地了解基本速度变得相当简单。

今年早些时候,我有一个项目必须处理一些用户生成的查询文本。我开始走上手动处理它的道路,但它很快就变得势不可挡。我花了几天时间才在ANTLR上加快速度,并在几天内运行了我的语法和处理器的初始版本。对要求的后续更改和调整会杀死任何自定义版本,但是一旦我启动并运行了ANTLR语法,就需要相对较少的精力来调整。

祝你好运!


答案 2

你可能需要考虑Xtext,它在内部使用ANTLR,并做了一些好事,比如为DSL自动生成编辑器。


推荐