我需要使用 ANTLR 并将给定表达式转换为其等效的 spring 表达式语言。下面是一组简单的示例输入和输出表达式。
输入:(账户='233AS77')AND(代码='SIMP')AND(成本=270)
输出 SpEL:(account.equalsIgnoreCase("233AS77")) 和 (code.equalsIgnoreCase("SIMP")) 和 (cost eq 270)
我该怎么办?有人可以帮我开始吗?我熟悉 SpEL,但对 ANTLR 及其概念完全陌生。如果有一个例子、片段或参考一篇扎实的文章来理解 ANTLR,那就太棒了。
我很晚才回答这个问题,主要是为了后代(以及我最近重新燃起对 ANTLR 的兴趣)。
我对原始问题中概述的问题整理了一个简单但完整的实现,包括一个可行的、基于 Maven 的项目设置。
有很多 ANTLR 介绍,但只有少数值得您花时间,从 官方文档 (以及 权威 ANTLR 4 参考资料 开始,尽管其发布日期尚未过时),然后继续 Strumenta 的 ANTLR Mega 教程 和 Baeldung 的简短但切中要点的教程。当然,根据我使用 ANTLR 的经验,遵循和理解别人的示例通常比编写自己的语法和语言应用程序更直接。另外,如果不先阅读一些内容,你就不能真正开始编写“语言应用程序”(尽管使用 ANTLR,不需要太多内容)。我将尝试总结以下问题的要点,并引导您完成我的实施。
ANTLR(或更准确地说,是ANTLR工具)是一个解析器生成器。这意味着您向其提供“语法”,即您定义的语言中所有可能句子结构的正式文本描述;然后,它生成(以一种或几种所谓的“目标语言”,其中 Java 为一种)“解析器”的代码,能够“分析”用该“输入”语言编写的程序。当被应用程序代码调用时,生成的解析器会尝试根据其构建的语法规则匹配其输入数据(不一定是文本,但也可以是二进制),成功后,它会构建一个解析树 ,输入的结构化表示。然后,您的应用程序可以使用自定义访问者(查看访问者设计模式的复习)或ANTLR运行时提供的ParseTreeWalker
来行走该树。在前一种情况下,您的自定义访问者扩展了 ANTLR 工具与解析器一起生成的基本访问者,并覆盖与感兴趣的各种解析树节点相对应的方法以处理成功的匹配。使用后一个选项,您可以实现 listener 方法来处理您感兴趣的树节点(请参阅观察者/监听器设计模式)。请注意,在第二种情况下,您还会获得一个生成的基本侦听器,概述了 ParseTreeWalker
将调用的可用方法。
更准确地说,您需要:
集成到您的应用程序构建管道中;毫无疑问,您可以偶尔根据您的语法执行该工具,以在构建应用程序之前生成解析器源代码。然而,更好的做法是将解析器源代码生成集成到构建管道中。使用 Maven(或 Gradle),您可以使用antlr4-maven-plugin,其默认值大部分都可以。请注意,您必须指定
-package