当前位置: 首页 > news >正文

使用antlr实现一个简单的表达式解析

背景

之前在做游戏的过程中,我们经常需要解析一些公式,比如(对方攻击值-对方防御值)*2这种表达式,我们习惯于用代码写死公式,但是这种方式不够灵活,我们想要的是一种灵活的解析方式,

只需要策划输入一个任意的一个表达式,我们就可以自动计算出来对应的数值,我们不需要理解策划的公式,那么问题就转化成了如何解析表达式公式呢?答案是使用antlr.

技术实现

antlr是一个解析器,包括两个部分:词法解析器和语法解析器,如下图所示:

在这里插入图片描述

antlr最大的优点是可以按照树的深度优先遍历访问所有的节点,比如下面的表达式:
(1) + 10 * 20 - 40/2 - (attack + defence)
如果我们使用简单的如下.g4文件来解析的话,

grammar Calc;prog: stat+;stat: expr                   # printExpr| ID '=' expr            # assign;expr: expr (MUL|DIV) expr # MulDiv| expr (ADD|SUB) expr # AddSub| INT                    # int| ID                     # id| '(' expr ')'           # parens;MUL : '*' ;DIV : '/' ;ADD : '+' ;SUB : '-' ;ID  : [a-zA-Z]+ ;INT : [0-9]+ ;WS  : [ \t\r\n]+ -> skip ;    // toss out whitespace

antlr可以解析成如下的解析树:
在这里插入图片描述

我们可以看出来如果我们编写一个Listener访问这棵树的话,我们可以得到完整的表达式,包括各个优先级都是正确的,当获取到这个按正确优先级排好序的指令后,我们可以通过简单的堆栈操作获取结果:

push(1)

push(10)

push(20)

pop(*)

pop(+)

push(40)

push(2)

pop(/)

pop(-)

push(attack)

push(defence)

pop(-)

pop(-)

注意这是一个深度优先遍历树的顺序,通过这个指令顺序,可以获取正确的表达式的值

总结

antlr提供了一种解析表达式的方便的方式,让我们可以解析任何用户或者策划提供的公式,它会按照深度优先树遍历的顺序返回数据和指令的顺序,方便我们计算最终的结果

http://www.lryc.cn/news/19157.html

相关文章:

  • 2月24日作业
  • SpringBoot可以同时处理多少请求?
  • 代码随想录【Day23】| 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树
  • Wsl2 ubuntu 配置git 阿里云codeup
  • 展会邀约 | 昂视与您相约BTF第12届上海锂电展
  • RK3568平台开发系列讲解(驱动基础篇)中断子系统框架
  • 消费复苏迎“春”暖,服装行业如何开启“狂飙”模式?
  • Springboot 整合Flowable工作流框架搭建
  • ASE0510SH-ASEMI的MOS管ASE0510SH
  • Golang学习Day2
  • Android 中malloc_debug 原理详解
  • D. Triangle Coloring【组合数学,乘法逆元】
  • 【读论文】AttentionFGAN
  • ClickHouse 配置文件使用说明
  • 如果不是互联网人,谁会找到这些神器?
  • Neo4j优化
  • CF1692G 2^Sort 题解
  • 关于物理像素,逻辑像素,像素比
  • JavaSE基础部分总结
  • C++基础知识
  • 2023/2/24 图数据库Neo4j的理解与应用
  • 适合视力障碍者的Linux
  • Tina Linux 存储开发指南
  • 【洛谷 P2670】[NOIP2015 普及组] 扫雷游戏 题解(模拟)
  • 【nohup引发磁盘读写高】nohup命令导致服务器磁盘读写占满该如何修复?
  • MySQL(二)索引和SQL优化
  • Java常用日期类(包含三代)_Date类及Calendar类等
  • 计算机网络你都懂了吗
  • 3.4 Spring Boot 日志配置
  • 3款百里挑一的国产软件,逆天好用,装了就舍不得卸载