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 ...
随机推荐
- Shell-17--break-exit-continue-shift
echo -n 表示不换行 break 会退出当前循环 break 2 ,可以指定退出几层循环 continue 退出当次循环
- 《机器学习实战(基于scikit-learn和TensorFlow)》第三章内容的学习心得
本章主要讲关于分类的一些机器学习知识点.我会按照以下关键点来总结自己的学习心得:(本文源码在文末,请自行获取) 什么是MNIST数据集 二分类 二分类的性能评估与权衡 从二元分类到多类别分类 错误分析 ...
- zuul熔断代码
package com.sun.fallback; import java.io.ByteArrayInputStream; import java.io.IOException; import ja ...
- ORACLE更新数据时如果有就更新没有就插入
SQL写法: begin update table_name set salary = 10000 where emp_id = 5; if sql%notfound then insert into ...
- linux中Java项目占用cpu、内存过高时的排查经历
一.使用top命令查看占用高资源的java项目的进程ID(pid): top 二.查看该进程中的线程所占用资源的情况:top -Hp pid 三.查看该线程对应的16进制:printf %x 1112 ...
- Java开发技术大揭底——让你认知自己技术上的缺陷,成为架构师
一.分布式架构体系 分布式怎么来的.传统的电信.银行业,当业务量大了之后,普通服务器CPU/IO/网络到了100%,请求太慢怎么办?最直接的做法,升级硬件,反正也不缺钱,IBM小型机,大型机,采购了堆 ...
- linux中一些简便的命令之tr
tr是个简单字符处理命令,主要有以下几个用法: 1.替换字符: echo "hello,world" | tr 'a-z' 'A-Z' 执行结果:HELLO,WORLD 注释:这里 ...
- eclipse 安装插件报错问题
报错信息 An error occurred while installing the items session context was:(profile=epp.package.jee, phas ...
- Gradle学习系列之读懂Gradle语法
转载地址: http://www.cnblogs.com/CloudTeng/p/3418072.html Gradle是一种声明式的构建工具.在执行时,Gradle并不会一开始便顺序执行build. ...
- 从零开始学 Web 之 JS 高级(二)原型链,原型的继承
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...