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 ...
随机推荐
- 利用nodejs安装并运行express的三个坑
概述 这是我安装并运行express的三个坑,应该是比较常见的,在此记录一下. 内容 express不是内部或外部命令 输入命令:express -V 报错:'express' 不是内部或外部命令,也 ...
- Bootstrap轮播如何支持移动端左右滑动
一直觉得bootstrap的轮播用起来很好用,代码简单,又支持响应式,不过从来没想过,也不知道原来bootstrap的轮播竟然不支持在手机上左右滑动 解决方法就是:使用滑动手势js插件:hammer. ...
- MySQL 字符集utf8和utf-8的关系
目录 什么是字符集(character set) 校对规则(collation) ASCII码 Unicode国际化支持 UTF-8 utf8 utf8与utf8mb4的关系 超集 字符集设置 什么是 ...
- SQL 的单引号转义字符
SQL 的转义字符是:'(单引号) 例:select * from user where name = '''06' 其中红色的单引号即表示转义字符,上例中 name的实际条件值为 '06,而不是 ' ...
- Windows Azure开发之Linux虚拟机
Windows Azure是微软的云服务集合,用来提供云在线服务所需要的操作系统与基础存储与管理的平台,是微软的云计算的核心组成组件之一.其中windows azure提供的最重要的一项服务就是 ...
- can only concatenate tuple (not "int") to tuple问题原因
#测试程序 import os from pydub import AudioSegment #已经确定, # enPath = "%s%s/%s"%(enDir,file,enf ...
- 一些oracle的经验
注:再写存储过程的时候,在for循环里要写begin和end,这样就可以写exception ,让这条错误数据回滚,然后记录错误日志,commit 关键字: oracle 存储过程 1.基本结构 CR ...
- 201. Orchard学习 一、基础
一.项目介绍 Orchard是一个免费和开源的社区交流项目,致力于在ASP.NET平台开发应用程序和可重用性组件.它将创建用于ASP.Net应用和扩展的共享组件,以及修改这些组件以便使其应用于终端用户 ...
- 使用 Portainer UI 管理 Docker 主机
Docker 使用命令行的方式来管理有时候并没有那么直观,可以使用 Portainer 的 UI 来管理 Docker 主机和 Docker Swarm 集群. 安装 Portainer 环境:cen ...
- 无源码调试smali
0x01 工具①Android Studio最新版.(用的1.5)②apktool尽量使用最新版的.(反编译本人用baksmali-2.1.3.jar)③smalidea插件.下载地址https ...