2018-01-17 Antlr4实现简单语言之整数比较表达式
续上文Antlr4: 修改语法规则更接近普通BNF格式.
例程
为先=1
为先 为2
=> 返回false
'为'作为关键词, 与数字可以连写, 但必须与变量名用空格间隔:
变量一=1
变量二=2
变量一×2为 变量二
实现
类似"求积表达式"语法规则模式, 添加如下:
表达式: 等同判断表达式;等同判断表达式: 比较表达式| 等同判断表达式 '==' 比较表达式| 等同判断表达式 '为' 比较表达式| 等同判断表达式 '!=' 比较表达式| 等同判断表达式 '≠' 比较表达式;比较表达式: 求和表达式| 比较表达式 '<' 求和表达式| 比较表达式 '>' 求和表达式| 比较表达式 '<=' 求和表达式| 比较表达式 '>=' 求和表达式| 比较表达式 '≤' 求和表达式| 比较表达式 '≥' 求和表达式;求和表达式: 求积表达式| 求和表达式 '+' 求积表达式| 求和表达式 '-' 求积表达式;
"定制访问器"中添加的部分如下, 由于语法规则模式相同, 构建树算法也相同:
@Overridepublic 节点 visit表达式(表达式Context 上下文) {return visit(上下文.等同判断表达式());}@Overridepublic 节点 visit等同判断表达式(等同判断表达式Context 上下文) {return 以本身向右扩展为运算节点(上下文, 上下文.等同判断表达式(), 上下文.比较表达式());}@Overridepublic 节点 visit比较表达式(比较表达式Context 上下文) {return 以本身向右扩展为运算节点(上下文, 上下文.比较表达式(), 上下文.求和表达式());}@Overridepublic 节点 visit求和表达式(求和表达式Context 上下文) {return 以本身向右扩展为运算节点(上下文, 上下文.求和表达式(), 上下文.求积表达式());}@Overridepublic 节点 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
转载于:https://www.cnblogs.com/program-in-chinese/p/10487790.html
2018-01-17 Antlr4实现简单语言之整数比较表达式相关推荐
- C语言表达式的求解规则,C语言实现整数四则运算表达式的计算
一.问题重述 [问题描述] 从标准输入中读入一个整数算术运算表达式,如5 - 1 * 2 * 3 + 12 / 2 / 2 = .计算表达式结果,并输出. 要求: 1.表达式运算符只有+.-.*./ ...
- 2018/01/22 爬虫日记
20171024 ①导入自定义的模块(如类),需要在当前类作导入 类的引用声明,如self.tool = tool.Tool() 20171025 ①正则表达式:两个<><>之 ...
- 2018.10.17考试
2018.10.17考试总结 1.咒语 (curse.pas/c/cpp) [题目描述] 亮亮梦到自己来到了魔法城堡, 但一扇巨大的石门阻拦了他通向城堡内的路.正当他沮丧之际,突然发现门上有一处机关, ...
- 2018.01.21.一周机器学习周记
时间:2018.01.21.一周 主要内容 1.整理前期关于决策树的一个小型实践项目文档(实践进行中) 2.搭建TensorFlow环境(进行中) 3.拓展:实践Python的自动化模块pyautog ...
- 西工大c语言noj100作业,西工大17秋《C语言程序设计》平时作业
Q:576696131 微信.Q均是1219895388 西工大17秋<C语言程序设计>平时作业 共题,总分:100分 答题中 分一.单选题共35题,70分 12分 结构化算法是( ). ...
- C# 2018.9.17
C# 2018.9.17 C#的优点: 1,不会有运行时崩溃,解决了C++的痛点一,难预防,难查错 2,使用文件不需要包含进来,只需要using namespace即可,解决了C++的痛点二,包含复杂 ...
- 【渝粤教育】国家开放大学2018年春季 0233-21T学前儿童语言教育 参考试题
试卷编号:0233 2017--2018学年度第二学期期末考试 学前儿童语言教育 2018年7月 1.前语言阶段,儿童发展了三方面能力,即前语言 .前语言 和前语言 . 2. 和 ,这是儿童学话中的关 ...
- 2018秋c语言程序设计考试答案,2018年自学考试《C语言程序设计》模拟试题【四篇】...
[导语]"一分耕耘一分收获",十载寒窗铸直了你挺拔的身姿,丰富的知识拉远你睿智的目光,岁月的流逝反衬出你娇美的容颜,奋斗的道路上,你的身影显得无比的昂扬.你与每一个成功拥抱,你的汗 ...
- 2019浙江C语言二级答案,2018年浙江省计算机二级c语言考试真题及答案
2018年浙江省计算机二级c语言考试真题及答案 [计算机等级考试官网暂未公布2018年浙江省计算机二级c语言考试真题及答案,届时小编会为你第一时间收集整理] 下面是学习啦小编给大家整理的计算机二级c语 ...
最新文章
- C# 实现简单打印(二)-打印一个文本文档,打印的内容是多行的
- 最新2018年全球DevOps薪资报告:行业和团队选择指南
- HTML5入门之样板和兼容IE浏览器篇
- 经济和信息化谋定研究-左晓栋:国家网络安全事件应急预案
- 酒店管理系统c语言带注释,酒店管理系统--C语言版.pdf
- 树莓派使用STEP7:安装wiringPi硬件外设驱动C库
- 手写字母数据集转换为.pickle文件
- LeetCode:Remove Nth Node From End of List 移除链表倒第n项
- JS-面向对象-创建具有私有属性的构造函数(2种方法)
- 【渝粤教育】国家开放大学2019年春季 0755-22T学前儿童艺术教育 参考试题
- 驱动人生:英伟达显卡驱动471.11官方版Win10+Win7最新下载地址
- MFC:读取整个记事本文件
- html基础学习笔记
- 华为服务器cpu型号,服务器cpu型号 数字
- 串口之DCB结构体详解
- Mysql 子查询 (查询语句中带查询语句)
- 基本财务管理知识(转载)
- HCM 初学 ( 二 ) - 信息类型
- python3.9.0a3详细安装教程_Python 3.9.1图文安装教程(附安装包) | 我爱分享网
- 达摩院用128张GPU烧出“中文版GPT-3”,我试了下,这文风不是开往幼儿园的车…...
热门文章
- bash-shell高级编程-变量的赋值
- SpringMVC和SpringBoot的拦截器 HandlerInterceptor 入门
- PS菜鸟入门 -- 实战演示之磨皮
- Judges' Time Calculation
- 【译】Why Wayland on Android is a hard problem
- 两步搞定Hyperledger主打区块链解决方案Fabric
- php 中国标准时间,linux 系统时间与硬件时间与中国标准时间
- sql语句多个表补齐四位_SQL学习笔记 - CTE通用表表达式和WITH用法
- python dendrogram_【聚类分析】《数学建模算法与应用》第十章 多元分析 第一节 聚类分析 python实现...
- qlabel文本改变信号_周明:NLP进步将如何改变搜索体验