使用ANTLR结合java和maven来解析表达式并将其转换为SpEL

问题描述 投票:0回答:1

我需要使用 ANTLR 并将给定表达式转换为其等效的 spring 表达式语言。下面是一组简单的示例输入和输出表达式。

输入:(账户='233AS77')AND(代码='SIMP')AND(成本=270)

输出 SpEL:(account.equalsIgnoreCase("233AS77")) 和 (code.equalsIgnoreCase("SIMP")) 和 (cost eq 270)

我该怎么办?有人可以帮我开始吗?我熟悉 SpEL,但对 ANTLR 及其概念完全陌生。如果有一个例子、片段或参考一篇扎实的文章来理解 ANTLR,那就太棒了。

spring parsing java-8 maven-3 antlr4
1个回答
0
投票

我很晚才回答这个问题,主要是为了后代(以及我最近重新燃起对 ANTLR 的兴趣)。

我对原始问题中概述的问题整理了一个简单但完整的实现,包括一个可行的、基于 Maven 的项目设置。

有很多 ANTLR 介绍,但只有少数值得您花时间,从 官方文档 (以及 权威 ANTLR 4 参考资料 开始,尽管其发布日期尚未过时),然后继续 Strumenta 的 ANTLR Mega 教程 和 Baeldung 的简短但切中要点的教程。当然,根据我使用 ANTLR 的经验,遵循和理解别人的示例通常比编写自己的语法和语言应用程序更直接。另外,如果不先阅读一些内容,你就不能真正开始编写“语言应用程序”(尽管使用 ANTLR,不需要太多内容)。我将尝试总结以下问题的要点,并引导您完成我的实施。

ANTLR(或更准确地说,是ANTLR工具)是一个解析器生成器。这意味着您向其提供“语法”,即您定义的语言中所有可能句子结构的正式文本描述;然后,它生成(以一种或几种所谓的“目标语言”,其中 Java 为一种)“解析器”的代码,能够“分析”用该“输入”语言编写的程序。当被应用程序代码调用时,生成的解析器会尝试根据其构建的语法规则匹配其输入数据(不一定是文本,但也可以是二进制),成功后,它会构建一个解析树 ,输入的结构化表示。然后,您的应用程序可以使用自定义访问者(查看访问者设计模式的复习)或ANTLR运行时提供的ParseTreeWalker行走该树。在前一种情况下,您的自定义访问者扩展了 ANTLR 工具与解析器一起生成的基本访问者,并覆盖与感兴趣的各种解析树节点相对应的方法以处理成功的匹配。使用后一个选项,您可以实现 listener 方法来处理您感兴趣的树节点(请参阅观察者/监听器设计模式)。请注意,在第二种情况下,您还会获得一个生成的基本侦听器,概述了 ParseTreeWalker 将调用的可用方法。 更准确地说,您需要:


ANTLR 工具
集成到您的应用程序构建管道中;毫无疑问,您可以偶尔根据您的语法执行该工具,以在构建应用程序之前生成解析器源代码。然而,更好的做法是将解析器源代码生成集成到构建管道中。使用 Maven(或 Gradle),您可以
使用antlr4-maven-plugin

,其默认值大部分都可以。请注意,您必须指定

-package

(ANTLR) 选项和输出目录,才能根据包定义以文件结构生成解析器(假设您在语法中定义了包)。
  1. ANTLR 运行时添加为项目的编译时依赖项。它包含生成的解析器、访问者、侦听器甚至您的代码可以使用的类(例如,错误处理策略等)。
    为您要定义的语言编写语法;语法是一组词汇和句法规则,定义解析器将如何尝试匹配其输入。在这种情况下,您需要一个
  2. 用于要转换为 SpEL 表达式的简单表达式的语法。请注意,一般来说,没有一种语法可以完成这项工作,但有几种语法可能会起作用。特别是当你从语言定义开始时,你经常会重新组织语法规则;因此,需要将解析器生成集成到构建管道中。
  3. 编写一个侦听器或自定义访问者来处理感兴趣的解析树节点。我所说的“处理”是指将解析树结构翻译成另一种语言,就像在我们的用例中,生成代码,解释表达式等。
  4. 将涉及创建、自定义和调用解析器实例的基本对象粘合在一起,然后遍历生成的解析树以生成所需的输出。
© www.soinside.com 2019 - 2024. All rights reserved.