续上文Antlr4: 修改语法规则更接近普通BNF格式.

例程

为先=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实现简单语言之整数比较表达式的更多相关文章

  1. 2018-02-18 Antlr4实现简单语言之条件语句

    本系列之前的文章: Antlr4的分析错误处理 Antlr4实现数学四则运算 Antlr4添加中文变量赋求值,括号,各种问题 Antlr4: 修改语法规则更接近普通BNF格式 Antlr4实现简单语言 ...

  2. International Programming Retreat Day(2018.11.17)

    时间:2018.11.17地点:北京国华投资大厦

  3. Dell Technology Summit(2018.10.17)

    时间:2018.10.17地点:北京国家会议中心

  4. Intel Digital Innovation Industry Summit(2018.08.17)

    时间:2018.08.17地点:北京金隅喜来登大酒店

  5. 2019/01/17 基于windows使用fabric将gitlab的文件远程同步到服务器(git)

    觉得django项目把本地更新push到gitlab,再执行fabric脚本从gitlab更新服务器项目挺方便的,当然从本地直接到服务器就比较灵活. 2019/01/17 基于windows使用fab ...

  6. IDEA(2018.01)安装和破解

    IDEA(2018.01)安装和破解 1.下载IDE https://www.jetbrains.com/idea/download/#section=windows 选择Ultimate版本 2.下 ...

  7. 调试大叔V2.1.0(2018.12.17)|http/s接口调试、数据分析程序员辅助开发神器

    2018.12.17 - 调试大叔 V2.1.0*升级http通讯协议版本,完美解决Set-Cookie引起的系列问题:*新增Content-Type编码格式参数,支持保存(解决模拟不同网站或手机请求 ...

  8. 中美贸易战再次开启,世界两极化进程正在加快形成!..... 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/

  9. C# Lambda 表达式学习之(四):动态构建类似于 c => c.Age == 2 || c.Age == 5 || c => c.Age == 17 等等一个或多个 OrElse 的表达式

    可能你还感兴趣: 1. C# Lambda 表达式学习之(一):得到一个类的字段(Field)或属性(Property)名,强类型得到 2. C# Lambda 表达式学习之(二):LambdaExp ...

随机推荐

  1. Shell-17--break-exit-continue-shift

    echo -n 表示不换行 break 会退出当前循环 break 2 ,可以指定退出几层循环 continue 退出当次循环

  2. 《机器学习实战(基于scikit-learn和TensorFlow)》第三章内容的学习心得

    本章主要讲关于分类的一些机器学习知识点.我会按照以下关键点来总结自己的学习心得:(本文源码在文末,请自行获取) 什么是MNIST数据集 二分类 二分类的性能评估与权衡 从二元分类到多类别分类 错误分析 ...

  3. zuul熔断代码

    package com.sun.fallback; import java.io.ByteArrayInputStream; import java.io.IOException; import ja ...

  4. ORACLE更新数据时如果有就更新没有就插入

    SQL写法: begin update table_name set salary = 10000 where emp_id = 5; if sql%notfound then insert into ...

  5. linux中Java项目占用cpu、内存过高时的排查经历

    一.使用top命令查看占用高资源的java项目的进程ID(pid): top 二.查看该进程中的线程所占用资源的情况:top -Hp pid 三.查看该线程对应的16进制:printf %x 1112 ...

  6. Java开发技术大揭底——让你认知自己技术上的缺陷,成为架构师

    一.分布式架构体系 分布式怎么来的.传统的电信.银行业,当业务量大了之后,普通服务器CPU/IO/网络到了100%,请求太慢怎么办?最直接的做法,升级硬件,反正也不缺钱,IBM小型机,大型机,采购了堆 ...

  7. linux中一些简便的命令之tr

    tr是个简单字符处理命令,主要有以下几个用法: 1.替换字符: echo "hello,world" | tr 'a-z' 'A-Z' 执行结果:HELLO,WORLD 注释:这里 ...

  8. eclipse 安装插件报错问题

    报错信息 An error occurred while installing the items session context was:(profile=epp.package.jee, phas ...

  9. Gradle学习系列之读懂Gradle语法

    转载地址: http://www.cnblogs.com/CloudTeng/p/3418072.html Gradle是一种声明式的构建工具.在执行时,Gradle并不会一开始便顺序执行build. ...

  10. 从零开始学 Web 之 JS 高级(二)原型链,原型的继承

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...