Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java antlr:将生成的解析器集成到系统中的最佳实践_Java_Antlr - Fatal编程技术网

Java antlr:将生成的解析器集成到系统中的最佳实践

Java antlr:将生成的解析器集成到系统中的最佳实践,java,antlr,Java,Antlr,这里是背景,我正在尝试创建一个DSL,允许客户编写简单的脚本来查询我们基于mongodb的数据库。我选择antlr来实现DSL 根据我的理解(如果不正确,请告诉我),有两种方法可以将antlr生成的解析器集成到系统中: 将代码嵌入语法文件,以便生成的解析器能够 直接用于对数据库进行查询并返回结果 特定格式(如json编码) 在将DSL文件提供给解析器之后,将解析器保持为纯粹的解析器,并通过从生成的解析器类检索AST在另一个类中构造查询 那么,作为一名antlr新手,你认为我应该走哪一条路?您能列

这里是背景,我正在尝试创建一个DSL,允许客户编写简单的脚本来查询我们基于mongodb的数据库。我选择antlr来实现DSL

根据我的理解(如果不正确,请告诉我),有两种方法可以将antlr生成的解析器集成到系统中:

  • 将代码嵌入语法文件,以便生成的解析器能够 直接用于对数据库进行查询并返回结果 特定格式(如json编码)
  • 在将DSL文件提供给解析器之后,将解析器保持为纯粹的解析器,并通过从生成的解析器类检索AST在另一个类中构造查询

  • 那么,作为一名antlr新手,你认为我应该走哪一条路?您能列出每种方法的优缺点吗,或者您有其他推荐方法吗?

    您不应该将业务逻辑嵌入到解析器中,因为维护可能会带来麻烦:您不想重新编译语法来修复业务逻辑中的错误,更不用说在生成的解析器中调试业务逻辑的噩梦了。因此,除了最小的玩具项目外,任何其他项目都不可能有选择一


    选项二可以通过多种方式实现:您可以(A)让ANTLR为您生成AST节点,并编写一个树解析器,或者(B)您可以跳过树解析器,并在解析器的操作中生成您自己的表示。我在Java和C#的生产项目中尝试了这两种方法,这两种方法都非常有效。我认为(A)和(B)之间的选择在很大程度上取决于您的个人品味,只要业务逻辑不在解析器中。

    您好,您的观点对我很有意义。那么,你能给我一个例子,说明你是如何生成自己的解析器表示的吗?@green显然,我不能给你发送属于我公司的代码。不过,它没有什么特别之处:我在每个规则中使用
    返回[DslNodeType res]
    ,其中
    DslNodeType
    是表示我解析的东西的类:一个二进制表达式、一个变量等。另外,在每个人都可见的网页中发布不受保护的电子邮件地址可能不是一个好主意:)thx。你说得对,我已经删除了我的邮箱地址。顺便说一句,我已经找到了我的方法,它很简单:1。创建一个超类,其中包含多个数据结构和受保护的方法以对其进行变异;2.在.g文件中,将超类选项设置为指向该超类;3.在规则中添加更新超类字段的操作,例如,
    period_type:('day''month''wee'){setPeriod($period_type.text);}
    @green祝贺您独立发现设计模式:)thx@dasblinkenlight!目前,我对如何实现域算术评估感到头痛。假设我现在可以根据DSL规范从数据库中获取一些聚合数据,但是有一些派生列,如
    colA/(colB+colA)和colC
    ,看起来这里需要一个智能复合设计模式。。。你知道吗?没有单一的“最佳方式”。就我个人而言,我喜欢让我的语法尽可能的空(尽可能少的嵌入代码)。我在这里创建了一些关于如何解析和评估一种小型编程语言(使用ANTLR)的博客帖子: