2018-02-18 Antlr4实现简单语言之条件语句
本系列之前的文章:
这一步, 实现了最简单的单条件, 只有"条件为真"时执行单语句. 例如:
变量=1 如果 变量<2 变量=变量×2 变量
返回2
实现
语法规则修改, 将原本的'声明'拆分出多个规则:
声明 : 赋值声明 | 如果声明 | 求值声明 | T新行 ; 如果声明 : '如果' 表达式 声明 ; 赋值声明 : T变量名 '=' 表达式 T新行 ; 求值声明 : 表达式 T新行 ;
"定制访问器"中, 赋值/求值声明只需修改类型, 添加的"如果声明"部分(需改名为"条件声明"之类):
@Override public 节点 visit如果声明(如果声明Context 上下文) { 条件节点 节点 = new 条件节点(); 节点.条件 = visit(上下文.表达式()); 节点.条件.原始文本 = 上下文.表达式().getText(); 节点.条件为真分支 = visit(上下文.声明()); return 节点; }
语法树节点新增类型:
public class 条件节点 extends 节点 { public 节点 条件; public 节点 条件为真分支; }
"运行器"的"求值"方法中添加条件节点的处理:
else if (节点 instanceof 条件节点) { Object 条件 = 求值(((条件节点) 节点).条件); if (条件 instanceof Boolean) { return (boolean)条件 ? 求值(((条件节点) 节点).条件为真分支) : null; } else { System.err.println("[运行时错误] 条件部分需为布尔值: " + ((条件节点) 节点).条件.原始文本); return null; } }
下面, 需要添加条件语句中对换行以及条件执行多个语句的支持, 需要选择是用{}还是其他特殊规则决定条件语句范围.

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
网站漏洞检测与修复之Discuz论坛3.4版本
Discuz!论坛目前最新版本为3.4版本,已经好久没有更新了,我们SINE安全在对其网站安全检测的同时发现一处漏洞,该漏洞可导致论坛的后台文件可以任意的删除,导致网站瘫痪,后台无法登陆。关于该网站漏洞的细节我们来详细的分析看一下: Discuz漏洞的检测与分析 该漏洞发生的位置在于source目录下的admincp文件夹里的admincp_forums.php代码里,我们用note编辑器打开查找到unlink函数调用的地方,就看到漏洞产生的原因了,直接搜索$_get{'replybgnew'],定位到代码。漏洞的使用有限制,必须是discuz管理员的权限,所以说漏洞危害较小,但也还是一处discuz的漏洞,如下图所示: 从上图我们看到代码首先会进行判断对于GET提交过来的参数会进行IF语句,从代码里获知当$multiset的值为真或者是为假的时候,就会将参数赋值为0,我们接着往下看另外一个的IF语句是如何使用的,当IF下来的时候会进行安全检测,将parse_url参数里的结果进行检测,来确定前端提交过来的网址是否正确,代码执行到最后一步我们看到attachurl的变量内容,竟然可以伪...
- 下一篇
2018-02-24 项目/教程中使用母语命名的"问题"
早先试图找使用中文命名代码的项目, 但所获寥寥: 索引: 用中文编写代码的实用开源项目 · Issue #6 · program-in-chinese/overview. 更不用说教程了: 索引: 用中文代码作示例的编程教程 · Issue #5 · program-in-chinese/overview 前几天有幸看到Quora不久前的一个回复: Has any serious project been written in a non-English-based programming language? 得知西门子和爱立信内部都有使用母语命名的C/C++代码(德语/瑞典语). 原文如下: At both Siemens (German) and Ericsson (Swedish), I have seen programs written in C, and C++ where the only English words are the keywords. So if, new, else, for and the standard libraries like std::v...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS关闭SELinux安全模块
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7设置SWAP分区,小内存服务器的救世主