中文编程知乎专栏原文地址

基本参考https://pragprog.com/book/tpantlr2/the-definitive-antlr-4-reference 一书"Building a Calculator Using a Visitor"一节, 仅添加了数学乘除法符号的支持(×÷). 比如下面的算式:

3×2+8÷4-2×4

源码仍在program-in-chinese/quan5

相比上一版本语法文件去除了空格定义. 需要深究的是优先级问题. 是否因为"表达式 运算符=('*'|'/'|'×'|'÷') 表达式"写在了前面才使得乘除法的优先级在语法分析时更高.

至此, 感觉Antlr语法文件对中文命名的支持还是不错的. 唯一需要权宜之计的就是Token(词)规则必须要大写开头, 因此采用了前缀"T"):

grammar 圈5;
程序: 表达式;表达式: 表达式 运算符=('*'|'/'|'×'|'÷') 表达式     #乘除| 表达式 运算符=('+'|'-') 表达式         #加減| T数                    #数;T数: [0-9]+;
T加 : '+';
T減 : '-';
T乘 : '*';
T数乘: '×';
T除 : '/';
T数除: '÷';

第一次尝试#标号的辅助功能. 一个"表达式"语法规则生成了三个Visitor方法(如下), 访问器仍比较简单. 注: 语法规则中要么所有分支都有标号, 要么都没有. 不然生成分析器时报错:

public class 定制访问器 extends 圈5BaseVisitor<节点> {@Overridepublic 节点 visit数(数Context 上下文) {TerminalNode 数 = 上下文.T数();return 数 instanceof ErrorNode ? null : new 数节点(数.getText());}@Overridepublic 节点 visit加減(加減Context 上下文) {表达式节点 节点 = new 表达式节点();节点.运算符 = 上下文.运算符.getType() == 圈5Parser.T加 ? 运算符号.加 : 运算符号.減;节点.左子节点 = visit(上下文.表达式(0));节点.右子节点 = visit(上下文.表达式(1));return 节点;}@Overridepublic 节点 visit乘除(乘除Context 上下文) {表达式节点 节点 = new 表达式节点();int 运算符 = 上下文.运算符.getType();节点.运算符 = (运算符 == 圈5Parser.T乘 || 运算符 == 圈5Parser.T数乘) ? 运算符号.乘 : 运算符号.除;节点.左子节点 = visit(上下文.表达式(0));节点.右子节点 = visit(上下文.表达式(1));return 节点;}}

语法树中稍微复杂一点的"表达式"节点, 代码很冗余:

public class 表达式节点 extends 节点 {public 运算符号 运算符;@Overridepublic Object 求值() {if (运算符.equals(运算符号.加)) {return (int)(左子节点.求值()) + ((int)右子节点.求值());} else if (运算符.equals(运算符号.減)) {return (int)(左子节点.求值()) - ((int)右子节点.求值());} else if (运算符.equals(运算符号.乘)) {return (int)(左子节点.求值()) * ((int)右子节点.求值());} else if (运算符.equals(运算符号.除)) {return (int)(左子节点.求值()) / ((int)右子节点.求值());} else {return null;}}}

已经要手动跑十个测试文件, 下面除了清理代码, 还需要加测试, 再加功能(应该是变量赋值).

2018-01-11 Antlr4实现数学四则运算相关推荐

  1. 【340天】我爱刷题系列099(2018.01.11)

    叨叨两句 ~ 牛客网--java专项练习078 1 类Parent和Child定义如下: 1 .class Parent{2. public float aFun(float a, float b) ...

  2. 2018/01/22 爬虫日记

    20171024 ①导入自定义的模块(如类),需要在当前类作导入 类的引用声明,如self.tool = tool.Tool() 20171025 ①正则表达式:两个<><>之 ...

  3. 2018.09-2018.11 Summary 2018.11-2019.01 plan

    总体内容 Mon 10Mon 17Mon 24OctoberMon 08Mon 15Mon 22Mon 29Mon 05Mon 12双流 Paper Part TSN Paper Part IELTS ...

  4. python编程入门与案例详解-quot;Python小屋”免费资源汇总(截至2018年11月28日)...

    原标题:"Python小屋"免费资源汇总(截至2018年11月28日) 为方便广大Python爱好者查阅和学习,特整理汇总微信公众号"Python小屋"开通29 ...

  5. 2018.01.21.一周机器学习周记

    时间:2018.01.21.一周 主要内容 1.整理前期关于决策树的一个小型实践项目文档(实践进行中) 2.搭建TensorFlow环境(进行中) 3.拓展:实践Python的自动化模块pyautog ...

  6. 2018年工业机器人销量排位_长安-2018年11月汽车销量 细分销量

    根据盖世汽车社区-销量数据库查询,为广大汽车行业人士整理了长安-2018年11月细分销量(按变速箱)数据如下: 变速箱类型 九月 十月 十一月 累计 4AT[TS-40/Ss-II] 4,655 4, ...

  7. 训练日志 2018.10.11

    这两天一直在弄树形DP,至此除了概率DP还没看,DP 专题基本就告一段落了,这个学期还剩下三个月左右,图论.数据结构.计算几何三个专题一个月一个. 之前学的一些算法还是掌握的不牢,打算先花一个星期左右 ...

  8. 暑期训练日志----2018.8.11

    训练第13天. 上午A了几个题,下午服务器崩了就回去睡觉了,然后晚上又A了几个 今天收获最大的就是明白怎么组合使用 Pollard Rho 算法与 Miller Rabin 算法,求大整数的所有因子 ...

  9. 泸州职称计算机,2018年11月四川泸州职称计算机考试10月8日开始报名

    [导语]2018年11月四川泸州职称计算机考试报名安排已发布,以下是无忧考网为您介绍了职称计算机考试时间.报名时间等,希望对大家有帮助,更多资料敬请关注无忧考网职称计算机考试频道,我们会为您及时更新相 ...

最新文章

  1. CEAC网络构建试题
  2. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) E. Goods transportation 动态规划
  3. [Swift]LeetCode513. 找树左下角的值 | Find Bottom Left Tree Value
  4. 使用GPG校验sign签名
  5. 创新、颠覆、引领,从 0 到百亿美元市值的创操作指南
  6. 记一次.NET 与R语言交互
  7. leetcode面试题 17.15. 最长单词
  8. 360桌面计算机,360桌面管理软件
  9. 理论基础 —— 线性表 —— 顺序表
  10. 打牢Python基础,看看这10语法如何
  11. 【01】如何在XMind中排列自由主题
  12. Asterisk的配置详解
  13. 关于log4j的配置
  14. poi操作PPT读取模板流,生成新PPT文件
  15. linux性能监控工具-nmon安装使用详细教程
  16. flink学习思维导图
  17. 十进制快速转换为二进制
  18. 优秀IT项目经理的六大特质_转帖IT专家网
  19. [机缘参悟-26]:鬼谷子-反应篇-反听之术,以退为进
  20. 计算机网络实验仿真系统设计,计算机网络安全实验仿真系统

热门文章

  1. html文字随机变色效果,html肿么让字体得到随机颜色
  2. go读取最后一行_CPU缓存体系对Go程序的影响
  3. pthread_detach 常规使用记录
  4. 2021固原一中高考成绩查询,【固原一中高考成绩实现新突破】
  5. matlab 将矩阵中的0置为Inf(邻接矩阵)
  6. FPGA设计心得(13)aurora的线速率及其用户时钟之间的关系?
  7. IC基础知识(3)通用模拟,数字和混合信号集成电路
  8. 深入浅析zookeeper的一致性模型及其实现
  9. 如果你也时常想要上进,我们可以相互鼓励,相互促进
  10. WebRTC内置debug工具,详细参数解读