续上文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. zuul熔断代码

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

  2. [原创]Struts2奇葩环境任意文件上传工具(解决菜刀无法传文件或上传乱码等问题)

    上面这问题问得好  1 不知道大家有没碰到有些Strus2站点  上传JSP后访问404 或者503    注意我说的是404或503不是403(要是403换个css/img等目录或许可以)    但 ...

  3. 关于resin的illegal utf8 encoding at (190)解决方式

    最近在项目开发中,出现了编码异常,内容如下:- illegal utf8 encoding at (190)com.caucho.jsp.JspParseException: illegal utf8 ...

  4. [原]ZolltyMVC框架简介

    ZolltyMVC框架是一款轻量级的Java应用编程框架(Java Application Framework),融合了常用的IOC/DI.MVC(注解.XML配置式.RESTful风格.模型驱动.视 ...

  5. python 打包exe

    下载及安装:pip install pyinstaller 执行命令: pyinstaller -F xxx.py pyinstaller --onefile meng.py 可以运行的exe文件位于 ...

  6. 源码编译安装lnmp环境

    一.源码编译安装步骤 首先说明源码安装的好处   速度快,可自定义路径 主要有三步:1.配置 进入源码安装包  ./configure --prefix=/uer/local/nginx  可指定参数 ...

  7. 工厂模式-Spring的InitializingBean实现

    一.创建产品角色接口: package org.burning.sport.design.pattern.factorypattern.spring.factory; public interface ...

  8. sql server 备份与恢复系列八 系统数据库备份与恢复分析

    一.概述 在前面讲过"sql server 备份与恢复系列"都是集中在用户数据库上.sql server还维护着一组系统数据库,这些系统数据库对于服务器实例的运行至关重要.在每次进 ...

  9. Java:类的构造函数

    类的构造函数   类的构造函数特点: 1. 构造函数也称为构造方法,构造函数名和类名相同.     2. 构造函数不能有返回值,也不能用void声明. 3. 构造函数可以有参数,也可以无参数,在一个类 ...

  10. Spring Boot SSL [https]配置例子

    前言 本文主要介绍Spring Boot HTTPS相关配置,基于自签证书实现: 通过本例子,同样可以了解创建SSL数字证书的过程: 本文概述 Spring boot HTTPS 配置 server. ...