php 加入 unless 语法
1. php 的版本 :PHP 7.3.0-dev (cli) (built: Mar 18 2018 00:28:55) ( NTS )
2. unless
语法结构:
unless($cond){
statement;
}
语法作用:
当 $cond 为假的时候,执行 statement 语句。
3. 代码修改
词法分析文件 : Zend/zend_language_scanner.l , 大约 1195 的地方,添加 5 -7 行、 13 - 15 行内容 :
<ST_IN_SCRIPTING>"while" {
RETURN_TOKEN(T_WHILE);
}
<ST_IN_SCRIPTING>"unless" {
RETURN_TOKEN(T_UNLESS);
}
<ST_IN_SCRIPTING>"endwhile" {
RETURN_TOKEN(T_ENDWHILE);
}
<ST_IN_SCRIPTING>"endunless" {
RETURN_TOKEN(T_ENDUNLESS);
}
语法分析文件 : Zend/zend_language_parser.y , 添加内容:
文件大约 271 行处, 添加 T_UNLESS 和 T_ENDUNLESS 内容:
reserved_non_modifiers:
T_INCLUDE | T_INCLUDE_ONCE | T_EVAL | T_REQUIRE | T_REQUIRE_ONCE | T_LOGICAL_OR | T_LOGICAL_XOR | T_LOGICAL_AND
| T_INSTANCEOF | T_NEW | T_CLONE | T_EXIT | T_IF | T_ELSEIF | T_ELSE | T_ENDIF | T_ECHO | T_DO | T_WHILE | T_ENDWHILE
| T_FOR | T_ENDFOR | T_FOREACH | T_ENDFOREACH | T_DECLARE | T_ENDDECLARE | T_AS | T_TRY | T_CATCH | T_FINALLY
| T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO
| T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT | T_BREAK
| T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE | T_CLASS
| T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_UNLESS | T_ENDUNLESS
;
文件大约 152 行处, 添加 2 和 4 行 的内容:
%token T_WHILE "while (T_WHILE)"
%token T_UNLESS "unless (T_UNLESS)"
%token T_ENDWHILE "endwhile (T_ENDWHILE)"
%token T_ENDUNLESS "endunless (T_ENDUNLESS)"
大约 235 行处 , 增加 unless_statement :
%type <ast> expr optional_expr while_statement unless_statement for_statement foreach_variable
大约 428 行处, 增加 3 和 4 行的内容 :
| T_WHILE '(' expr ')' while_statement
{ $$ = zend_ast_create(ZEND_AST_WHILE, $3, $5); }
| T_UNLESS '(' expr ')' unless_statement
{ $$ = zend_ast_create(ZEND_AST_UNLESS, $3, $5); }
大约 598 行处 ,增加 6 - 9 行的内容 :
while_statement:
statement { $$ = $1; }
| ':' inner_statement_list T_ENDWHILE ';' { $$ = $2; }
; unless_statement:
statement { $$ = $1; }
| ':' inner_statement_list T_ENDUNLESS ';' { $$ = $2; }
;
Zend/zend_ast.h 的头文件中 ,大约 134 行处 , 增加 2 行的内容:
ZEND_AST_GROUP_USE,
ZEND_AST_UNLESS, /* 3 child nodes */
Zend/zend_ast.c 的文件中, 函数 zend_ast_export_stmt 内,大约 915 行处, 添加 7 行的内容:
zend_ast_export_indent(str, indent);
zend_ast_export_indent(str, indent);
zend_ast_export_ex(str, ast, 0, indent);
switch (ast->kind) {
case ZEND_AST_LABEL:
case ZEND_AST_IF:
case ZEND_AST_UNLESS:
case ZEND_AST_SWITCH:
case ZEND_AST_WHILE:
case ZEND_AST_TRY:
case ZEND_AST_FOR:
case ZEND_AST_FOREACH:
case ZEND_AST_FUNC_DECL:
case ZEND_AST_METHOD:
case ZEND_AST_CLASS:
case ZEND_AST_USE_TRAIT:
case ZEND_AST_NAMESPACE:
case ZEND_AST_DECLARE:
break;
default:
smart_str_appendc(str, ';');
break;
}
smart_str_appendc(str, '\n');
Zend/zend_compile.c 的文件中 ,
大约 4667 行, 添加 zend_compile_ unless 函数 :
void zend_compile_unless(zend_ast *ast)
{
zend_ast *cond_ast = ast->child[0];
zend_ast *stmt_ast = ast->child[1];
znode cond_node; uint32_t opnum_cond; zend_compile_expr(&cond_node,cond_ast); opnum_cond = zend_emit_cond_jump(ZEND_JMPNZ,&cond_node,0); zend_compile_stmt(stmt_ast); zend_update_jump_target_to_next(opnum_cond);
}
zend_compile_stmt 函数中, 大约 8200 行处 :
case ZEND_AST_IF:
zend_compile_if(ast);
break;
case ZEND_AST_UNLESS:
zend_compile_unless(ast);
break;
4. 删除 Zend 目录下的 zend_language_parser.c 和 zend_language_scanner.c 文件,重新编译,安装 php .
5. 测试代码:
<?php
unless(0)
{
echo "Hello the world!\n";
} unless(0):
echo "Hello the world!\n";
endunless;
输出:
root@ubuntu:~/tmp# php a.php
Hello the world!
Hello the world!
参考:
http://www.laruence.com/2010/07/16/1648.html
php 加入 unless 语法的更多相关文章
- 我的MYSQL学习心得(一) 简单语法
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- Swift与C#的基础语法比较
背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...
- 探索C#之6.0语法糖剖析
阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和fin ...
- [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性
回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...
- Velocity初探小结--velocity使用语法详解
做java开发的朋友一般对JSP是比较熟悉的,大部分人第一次学习开发View层都是使用JSP来进行页面渲染的,我们都知道JSP是可以嵌入java代码的,在远古时代,java程序员甚至在一个jsp页面上 ...
- node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法
1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...
- C#语法糖大汇总
首先需要声明的是"语法糖"这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换:而且可以提高开发编码的效率,在性能上也不会带来损失.这让java开发人员羡慕 ...
- 值得注意的ibatis动态sql语法格式
一.Ibatis常用动态sql语法,简单粗暴用一例子 <select id="iBatisSelectList" parameterClass="java.util ...
- Flex 布局教程:语法篇
作者: 阮一峰 网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便 ...
- postgresql 基本语法
postgresql数据库创建/修改/删除等写入类代码语法总结: 1,创建库 2,创建/删除表 2.1 创建表 create table myTableName 2.2 如果表不存在则创建表 crea ...
随机推荐
- xshell使用小技巧
1. 方便复制:Tool --> options --> right buttion(paste the clipboard contents) and copy selected te ...
- 摩托罗拉GP68对讲机官方说明书下载,包含使用说明压音表和电路结构等
摩托罗拉GP68对讲机官方说明书,包含使用说明和电路结构等 1.使用说明书 链接: https://pan.baidu.com/s/1fhXXaBp-MSuQs9Sv3v_Crg 提取码: mc3e ...
- 如何使用rsync备份
已知3台服务器主机名分别为web01.backup .nfs主机信息见下表: 角色 外网IP(NAT) 内网IP(LAN) 主机名 WEB eth0:10.0.0.7 eth1:172.16.1.7 ...
- CDH集群安装
1 软硬件准备 1.1 准备三个节点 序号 主机名 内存 CPU IP地址 角色 1 cdh1 8G 8核心 192.168.5.78 cloudera-scm-server,mysql 2 cdh2 ...
- Vue学习之vue实例中的数据、事件和方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- php 上传word文件 Word文件转 PDF
说一下,之前的时候做上传word文档转pdf的项目时候, 通过安装open office 连接服务组件, 遇到种种问题, 例如上传的word文档版本,, word文档中编辑的样式复杂会出现转pdf失败 ...
- node项目的基本目录结构
1.public目录: 项目公共目录,存放静态资源(img.js.css)和公共资源,404错误提示页面: 2.routor目录: 路由控制器目录,存放路由文件,将所有的业务逻辑都都写在这里: 3.v ...
- Hadoop核心组件之MapReduce
MapReduce概述 Google MapReduce的克隆版本 优点:海量数据的离线处理,易开发,易运行 缺点:实时流式计算 Hadoop MapReduce是一个软件框架,用于轻松编写应用程序, ...
- 为博客添加 Gitalk 评论插件
背景 Disqus需要翻墙才能正常使用 畅言有广告 2种评论系统都很难统一管理 优化 使用Gitalk评论插件 , gitalk 使用 Github 帐号登录,界面干净整洁,支持 MarkDown语法 ...
- Ajax async属性
async: 默认是true:异步,false:同步. 其他属性扩展: 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数, ...