2018-01-17 Antlr4实现简单语言之整数比较表达式
例程
为先=1
为先 为2
=> 返回false
'为'作为关键词, 与数字可以连写, 但必须与变量名用空格间隔:
变量一=1
变量二=2
变量一×2为 变量二
实现
类似"求积表达式"语法规则模式, 添加如下:
表达式
: 等同判断表达式;
等同判断表达式
: 比较表达式
| 等同判断表达式 '==' 比较表达式
| 等同判断表达式 '为' 比较表达式
| 等同判断表达式 '!=' 比较表达式
| 等同判断表达式 '≠' 比较表达式
;
比较表达式
: 求和表达式
| 比较表达式 '<' 求和表达式
| 比较表达式 '>' 求和表达式
| 比较表达式 '<=' 求和表达式
| 比较表达式 '>=' 求和表达式
| 比较表达式 '≤' 求和表达式
| 比较表达式 '≥' 求和表达式
;
求和表达式
: 求积表达式
| 求和表达式 '+' 求积表达式
| 求和表达式 '-' 求积表达式
;
"定制访问器"中添加的部分如下, 由于语法规则模式相同, 构建树算法也相同:
@Override
public 节点 visit表达式(表达式Context 上下文) {
return visit(上下文.等同判断表达式());
}
@Override
public 节点 visit等同判断表达式(等同判断表达式Context 上下文) {
return 以本身向右扩展为运算节点(上下文, 上下文.等同判断表达式(), 上下文.比较表达式());
}
@Override
public 节点 visit比较表达式(比较表达式Context 上下文) {
return 以本身向右扩展为运算节点(上下文, 上下文.比较表达式(), 上下文.求和表达式());
}
@Override
public 节点 visit求和表达式(求和表达式Context 上下文) {
return 以本身向右扩展为运算节点(上下文, 上下文.求和表达式(), 上下文.求积表达式());
}
@Override
public 节点 visit求积表达式(求积表达式Context 上下文) {
return 以本身向右扩展为运算节点(上下文, 上下文.求积表达式(), 上下文.最小表达式());
}
...
private 节点 以本身向右扩展为运算节点(ParserRuleContext 上下文, ParserRuleContext 本身子节点, ParserRuleContext 扩展子节点) {
节点 比较节点 = visit(扩展子节点);
if (本身子节点 == null) {
return 比较节点;
} else {
return 构建运算节点(取运算符(上下文), 本身子节点, 比较节点);
}
}
// 第二个子节点为运算符
private 运算符号 取运算符(ParserRuleContext 原始表达式) {
int 最后运算符 = ((TerminalNodeImpl) 原始表达式.getChild(1)).symbol.getType();
switch (最后运算符) {
case 圈5Parser.T加:
return 运算符号.加;
case 圈5Parser.T減:
return 运算符号.減;
case 圈5Parser.T乘:
case 圈5Parser.T数乘:
return 运算符号.乘;
case 圈5Parser.T除:
case 圈5Parser.T数除:
return 运算符号.除;
case 圈5Parser.T相等:
case 圈5Parser.T为:
return 运算符号.相等;
default:
return null;
}
}
下面是需要细究的部分, 由于变量名包括了"为"字, 因此如果把这个词-"为"定义在"T变量名"之后, 词法分析就会有问题.
T为: '为';
另外, 如果不添加空格忽略规则, 如果代码里带空格, 也会词法分析错误. 加了此规则之后就支持"为先 为2":
T空格: [ ]+ ->skip;
在"运行器"的"求值"方法中, 添加"相等"支持:
case 相等: return 左结果 == 右结果;
大于(等于), 小于(等于), 不等支持也是类似实现. 源码版本号: program-in-chinese/quan5
2018-01-17 Antlr4实现简单语言之整数比较表达式的更多相关文章
- 2018-02-18 Antlr4实现简单语言之条件语句
本系列之前的文章: Antlr4的分析错误处理 Antlr4实现数学四则运算 Antlr4添加中文变量赋求值,括号,各种问题 Antlr4: 修改语法规则更接近普通BNF格式 Antlr4实现简单语言 ...
- International Programming Retreat Day(2018.11.17)
时间:2018.11.17地点:北京国华投资大厦
- Dell Technology Summit(2018.10.17)
时间:2018.10.17地点:北京国家会议中心
- Intel Digital Innovation Industry Summit(2018.08.17)
时间:2018.08.17地点:北京金隅喜来登大酒店
- 2019/01/17 基于windows使用fabric将gitlab的文件远程同步到服务器(git)
觉得django项目把本地更新push到gitlab,再执行fabric脚本从gitlab更新服务器项目挺方便的,当然从本地直接到服务器就比较灵活. 2019/01/17 基于windows使用fab ...
- IDEA(2018.01)安装和破解
IDEA(2018.01)安装和破解 1.下载IDE https://www.jetbrains.com/idea/download/#section=windows 选择Ultimate版本 2.下 ...
- 调试大叔V2.1.0(2018.12.17)|http/s接口调试、数据分析程序员辅助开发神器
2018.12.17 - 调试大叔 V2.1.0*升级http通讯协议版本,完美解决Set-Cookie引起的系列问题:*新增Content-Type编码格式参数,支持保存(解决模拟不同网站或手机请求 ...
- 中美贸易战再次开启,世界两极化进程正在加快形成!..... Copyright: 1688澳洲新闻网 Read more at: https://www.1688.com.au/world/international/2018/06/17/369368/
中美贸易战再次开启,世界两极化进程正在加快形成! https://www.1688.com.au/world/international/2018/06/17/369368/
- C# Lambda 表达式学习之(四):动态构建类似于 c => c.Age == 2 || c.Age == 5 || c => c.Age == 17 等等一个或多个 OrElse 的表达式
可能你还感兴趣: 1. C# Lambda 表达式学习之(一):得到一个类的字段(Field)或属性(Property)名,强类型得到 2. C# Lambda 表达式学习之(二):LambdaExp ...
随机推荐
- Java 大数值类型执行精确计算
简介 如果基本的整数和浮点数精度不能够满足需求,那么可以使用 java.math 包下两个很有用的类:BigInteger 和 BigDecimal.这两个类可以处理包含任意长度数字序列的数值,Big ...
- 如何使用react-redux——傻瓜版
概述 之前看redux官方文档真是看得一脸懵逼,现在自认为会用了,于是来总结一下用法,供以后开发时参考,相信对其他人也有用. 不得不说,用了redux之后感觉挺爽的,有如下优点: 组件大多是函数组件非 ...
- LabVIEW(十):数组和簇
一.数组 1.创建数组 (1).前面板右键>“数组.矩阵与簇”>数组. (2).前面板右键>(选择要添加的数组数据类型,比如创建数值数组)数值>将“数值输入控件”拖入数组中. ...
- spring boot 通过controller跳转到指定 html 页面问题以及请求静态资源问题
1. 项目结构 2. pom文件配置 重点是红色框内的依赖 3. application配置文件 4. controller 注意使用@Controller注解: @RestController 等价 ...
- Spring.Net实现跨数据库服务层事务管理
在实际项目中用了Spring.Net框架之后,发现这框架在处理数据库事务上特别强大,声明式的数据库事务解放了一般开发人员对数据库事务操作的复杂处理.尤其是多数据库事务处理上,尤为显得更简便,几个简单的 ...
- scikit-image 图像处理库介绍
今天学习图像处理的时候,无意中看到了scikit 软件包,抱着学习的态度,这里做个记录,方便以后翻阅. 概念:scikit-image 是一种开源的用于图像处理的 Python 包.它包括分割,几何变 ...
- Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
前几天写了一篇 Java 8 即将在 2019 年停止免费向企业提供更新的文章,企图迫使用户向更新一代的 Java 版本升级,但让人遗憾的是,小编今天收到了 Oracle Java 版本的升级推送,装 ...
- shell中的算数
加法:let result=var1+var2result=$[$var1+var2]result=$(($var1+var2))result=`expr $var1 + $var2*` 加号前后有空 ...
- Android中为什么需要服务?
在解释这个问题之前, 先来看一个Android系统中进程的优先级(从高到低) 前台进程(foreground process ): 一个应用程序启动, 并且可以直接相应用户的点击,触摸事件.那么这样 ...
- Vue + Element UI 实现权限管理系统 前端篇(十一):第三方图标库
使用第三方图标库 用过Elment的同鞋都知道,Element UI提供的字体图符少之又少,实在是不够用啊,幸好现在有不少丰富的第三方图标库可用,引入也不会很麻烦. Font Awesome Font ...