构建 Antlr4 AST的一点心得

BITMINICC——利用Antlr的Listener生成AST BITMINICC生成AST 首先请花一定的时间阅读下面的参考方法,本文是我对下面文章的一个理解和踩坑记录。 参考方法:https://zhuanlan.zhihu.com/p/369250644?utm_source=qq&utm_medium=social&utm_oi=732535204933025792 1.一个好的文法 因为要用Antlr生成Lexer以及Listener,所以一个定义完整的文法是最重要的。因为当你用一个缺陷的文法,重写好了Listener,分析好了上一个实 阅读详情

项目上需要用到实现自定义的一套 filter dsl, 来增强 es 搜索的能力. 采用了Antlr4作为语法解析工具, Antlr4 需要我们提供一套语法规则来帮助构建语法树, 那我们想要实现的效果大概有以下几个点:

  • 语句之间的逻辑关系支持 "与" 和 "或", 可以支持"&&", "and" "||", "or" 的格式

  • 支持的条件判断有"eq" , "ne", "gt", "ge", "lt", 'le", "in", "has".

  • 支持的数据的类型有两种, 字符串"String"和数字"Number"以及两者的数组类型.

  • 同时需要支持 "( )" 的无限嵌套形式.

下面是个参考示例:

" 'sku.name' has '香水' and ('sku.price' le 120.5 || 'shop.address' in ['湖南', '广州'])"

意思很清晰就是: 商品名包含香水, 价格小于120.5或店铺地址在湖南或者广州.

这种语法其实算比较简单的了,规则不多也比较容易理解, 要说难点的话可能就是如何优雅地处理类似 '(xxx (xxx) (xxx) ) (xxx)' 这样的结构.下面也是我自己摸索出来的tips 可以帮助更快的去构建语法树.

  1. 列出一些示例, 基本涵盖我们需要支持的所有规则, 可以先从简单的开始

  • 简单语句: " 'sku.name' eq '手表' "

  • 复合语句: '' 'address' in ['CN', 'US'] and 'price' gt 10"

  • 嵌套语句: " ('address' in ['CN', 'US'] and 'price' gt 10) || ('sku.name' eq '手表' && 'shop.name' has '中国')"

  1. 模式拆解. 不难看出,这个语法的组成模式就是表达式之间的逻辑组合, 抽象成 expr bool expr , expr是最小的语句单元, 可以得到true或者false的结果, bool是'&&' '||'. 那么对于嵌套的语句呢? 一个嵌套语句是多个嵌套语句或者expr的组合, 也可以得到true或者false的结果. 那么使用一个更上层的符号stmt来表示, stmt的child可以是expr或者stmt.

  1. 针对列出来的语句, 尝试动手画出来, 通过不断的尝试和优化找到合理的语法树结构,例如

  1. 使用antlr的语法进行描述. 在有了合理的语法树之后,再将它转换成对应的描述方式就比较容易了. 下面是我的g4文件

grammar EsFilter;

filter : stmt? EOF;

stmt
: expr
| '(' stmt ')'
| stmt Condition stmt
;

expr: val Op val;

val: const | arr ;

Op
  : 'eq'
  | 'ne'
  | 'gt'
  | 'ge'
  | 'lt'
  | 'le'
  | 'has'
  | 'in'
  ;

Condition
  : '&&'
  | 'and'
  | '||'
  | 'or'
  ;

const
  : NUMBER
  | STRING
  ;

arr : '[' const (',' const )* ']';

NUMBER
   : '-'? INT ('.' [0-9]+)? EXP?
   ;

fragment INT
   : '0' | [0]* [1-9] [0-9]*
   ;

fragment EXP
  : [Ee] [+-]? INT
  ;

//STRING : ''' (ESC | SAFECODEPOINT)* ''';
STRING : ''' .*? ''';

WS : ('\t' | ' ' | '\n')+ -> skip;

ANTLR4规则解析生成器(一):入门 ANTLR是ANother Tool for Language Recognition的缩写,它是一个强大的用于读取、处理、执行和翻译结构化文本或二进制文件的语法分析器生成器,广泛用于构建语言、工具和框架,通过语法描述规则,它能够生成一个可以遍历解析树的解析器。ANTLR4是ANTLR的第4个版本。 阅读详情

相关推荐

Linux下使用ANTLR4解析SystemVerilog代码

Antlr4(Another Tool for Language Recognition)是一款基于Java开发的开源的语法分析器生成工具,能够根据语法规则文件生成对应的语法分析器,广泛应用于DSL构建,语言词法语法解析等领域。

qq_44463933的博客 1316

antlr4权威指南(中文版)资料分享

ANTLR4的基础教程中文文档

weixin_45747396的博客 5908

antlr4权威指南.tar

antrl4权威指南pdf

antlr4权威指南中文pdf_科学知识图谱PDF指南

点击下载:SCI2中文指南.pdf 点击下载:CiteSpace 中文指南.pdf(补充了内容)下载地址:科学领域叠加图分析指南.pdf

weixin_39850167的博客 1089

antlr4权威指南

antlr4权威指南,适合想要构建自己的语言的同学,使用antlr4构建更方便

The Definitive ANTLR 4 Reference.pdf

英文版:学习ANTLR4的宝典,是原作者的力作。每个版本都会写这么一本书。

antlr4 idea插件_从定义到AST及其遍历方式,一文带你搞懂Antlr4

​【摘要】本文将首先介绍Antlr4 grammer的定义方式,如何通过Antlr4 grammer生成对应的AST,以及Antlr4 的两种AST遍历方式:Visitor方式和Listener方式。1、Antlr4简单介绍Antlr4(Another Tool for Language Recognition)是一款基于Java开发的开源的语法分析器生成工具,能够根据语法规则文件生成对应的语法分...

weixin_34227128的博客 2002

Antlr4指南

Antlr4指南 权威介绍 学习教程

从定义到AST及其遍历方式,一文带你搞懂Antlr4

摘要:本文将首先介绍Antlr4 grammer的定义方式,如何通过Antlr4 grammer生成对应的AST,以及Antlr4 的两种AST遍历方式:Visitor方式和Listener方式。 1. Antlr4简单介绍 Antlr4(Another Tool for Language Recognition)是一款基于Java开发的开源的语法分析器生成工具,能够根据语法规则文件生成对应的语法分析器,广泛应用于DSL构建,语言词法语法解析等领域。现在在非常多的流行的框架中都用使用,例如,在构建特定语

华为云官方博客 3858

ANTLR入门详细教程定稿.pdf

ANTLR入门详细教程定稿.pdf

ANTLR 4权威指南:解析与语言处理的艺术

本书《ANTLR 4权威指南:解析与语言处理的艺术》深入浅出地介绍了ANTLR 4的强大功能及其实现方式,适用于任何希望学习如何构建数据读取器、语言解释器和翻译器的程序员。书中不仅涵盖了ANTLR的基本概念,还提供了丰富的实例,帮助读者理解词法分析器和语法分析器的工作原理。ANTLR 4的最新特性,如适应性LL(*)解析技术和简化语法冲突处理,使得开发语言应用变得更加直观和高效。本书通过实战案例,如JSON、R语言的解析,以及创建简单的C样式的编程语言,使读者能够在实践中掌握ANTLR的精髓。此外,书中还探讨了如何通过ANTLR生成的解析树来实现语言应用,并介绍了如何利用监听器和访问者模式来处理解析结果。无论你是初学者还是经验丰富的开发者,本书都将是你不可或缺的参考书。

ANTLR笔记4 - AST构造,tree grammar,tree walker

目前为止使用的例子中,都是直接在语法文件中嵌入求值处理代码,这种方式ANTLR称为嵌入式动作(embeded action)。复杂情况下,需要基于语法树遍历(walking the tree)生成目标代码。embeded action将处理代码跟语法描述混合起来,语法复杂时使语法文件臃肿。另外语法可能经常需要修改,但语法的主要表达式不会变动,将语法识别与转换、生成(目标代码)等处理分离是有好处的...

jackyhungvip的博客 1646

java Antlr 4 语法文件合集

java Antlr 4 语法文件合集

Godot LuaScript插件架构解析:从Antlr4解析器到AST构建

LuaScript插件为Godot Engine提供了完整的Lua语言支持,其核心架构围绕**Antlr4解析器**与**抽象语法树(AST)** 构建展开。本文将深入剖析这一过程的技术细节,帮助开发者理解从Lua代码到Godot引擎可执行指令的完整转换流程。 ## 一、架构总览:解析流程的四个关键阶段 LuaScript插件的代码解析系统采用经典的编译器前端架构,主要包含四个阶段: 1.

gitblog_01122的博客 716

QEMU+KVM实战:5分钟搞定Ubuntu 24.04虚拟机搭建(附性能优化技巧)

本文详细介绍了在Linux宿主机上使用QEMU和KVM快速搭建Ubuntu 24.04虚拟机的完整实战流程。内容涵盖从环境准备、核心组件解析到具体的安装命令,并重点分享了针对CPU、内存、存储I/O及网络性能的深度优化技巧,旨在帮助用户构建一个响应迅速、资源隔离良好的高性能虚拟化开发与测试环境。

j2k3l4的博客 754

高效低功耗设计:PMOS电子开关在墨水屏与ADC采样电路中的创新应用

本文深入探讨了PMOS电子开关在低功耗设计中的创新应用,特别是在墨水屏和ADC采样电路中的关键作用。通过详细分析PMOS的导通机制和近乎零静态功耗特性,展示了其在待机低功耗场景下的显著优势,并提供了实用的电路设计技巧和元器件选型建议,帮助工程师实现极致的功耗优化。

weixin_29193359的博客 163

ANTLR4入门【打造你自己的语法规则】

antlr4学习,结合idea使用,java代码实现一个带括号的四则运算规则

qq_33129875的博客 1万+

ESP32-S3打造离线语音助手:从零部署自定义唤醒词与本地大模型推理【实战指南】

本文详细介绍了如何利用ESP32-S3芯片打造离线语音助手,包括自定义唤醒词训练与本地大模型推理的实战指南。通过硬件架构解析、音频处理优化及性能调优技巧,实现低延迟、高隐私保护的语音交互方案,特别适合智能家居和物联网应用。

weixin_30296405的博客 608

Antlr4 怎么用

(1)定义.g4语法文件;(2)使用 ANTLR 4 工具,生成词法分析器(Lexer)和语法分析器(Parser)目标编程语言代码(3)遍历 AST(抽象语法树):访问者模式(Visitor)和监听器模式(Listener)

weixin_45755222的博客 4088

Sigrity System Explorer ViaWizard模式进行过孔建模和仿真分析操作指导

点击TVac_lower tdvac_lower,自动跳转到2D时域曲线,查看最小低电平穿过VIL(ac)max电压的延时,结果如下。点击TVac_high tdvac_high,自动跳转到2D时域曲线,查看最小高电平穿过VIH(ac)min电压的延时,结果如下。点击max Vix_Rise,自动跳转到2D时域曲线,查看上升边PN交叉点与参考电压VREF(dc)的偏差,结果如下。Threshold:阈值,软件自带3个模板,default,Tr01,Tr02,本例选择Default。

weixin_54787054的博客 572

20 Embedding 与向量检索:语义为什么能变成距离

Embedding 是 RAG 语义检索的数学基础。本文用工程视角讲清文本如何变成向量,为什么语义相近会表现为距离相近,Top-K 检索如何工作,以及在模型选择、同模型约束、精确匹配和召回评估上的常见坑。

老于的笔记的专栏 6204
上一篇: 凭借这份Java中高级核心知识全面解析,大专学历的我也能薪资翻倍!
下一篇: 面试造火箭?Ali大佬实测“2023 IT大厂Java面试真题总汇” 为上岸
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值