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 语法的更多相关文章

  1. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  2. Swift与C#的基础语法比较

    背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...

  3. 探索C#之6.0语法糖剖析

    阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和fin ...

  4. [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性

    回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...

  5. Velocity初探小结--velocity使用语法详解

    做java开发的朋友一般对JSP是比较熟悉的,大部分人第一次学习开发View层都是使用JSP来进行页面渲染的,我们都知道JSP是可以嵌入java代码的,在远古时代,java程序员甚至在一个jsp页面上 ...

  6. node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法

    1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...

  7. C#语法糖大汇总

    首先需要声明的是"语法糖"这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换:而且可以提高开发编码的效率,在性能上也不会带来损失.这让java开发人员羡慕 ...

  8. 值得注意的ibatis动态sql语法格式

    一.Ibatis常用动态sql语法,简单粗暴用一例子 <select id="iBatisSelectList" parameterClass="java.util ...

  9. Flex 布局教程:语法篇

    作者: 阮一峰 网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便 ...

  10. postgresql 基本语法

    postgresql数据库创建/修改/删除等写入类代码语法总结: 1,创建库 2,创建/删除表 2.1 创建表 create table myTableName 2.2 如果表不存在则创建表 crea ...

随机推荐

  1. Winform中实现ZedGraph曲线图的图像复制到剪切板、打印预览、获取图片并保存、另存为的功能

    场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...

  2. [Optimized Python] 17 - Performance bottle-neck

    前言 对于一门编程语言,没接触到“优化”和“库代码”的源码理解程度,不足以谈“掌握”二字. 本篇的学习笔记,同时也意味着自己终于触及到了Python的junior国际水准.(joke) 要学的东西有很 ...

  3. [LeetCode] 由 “分形" 所想

    分形思想和递归思想有区别么? 一.简单例子 函数调用自己,简化了理解逻辑,但其他到处都是问题. #%% def listsum(numList): if len(numList) == 1: retu ...

  4. 关闭vue的eslint代码检测和WebStorm的代码检测

    1. 在vue项目中 bulid > webpack.base.conf.js 中: 如图,在rules规则中有一条规则是校验代码的,也就是红框2那行,要取消可以直接注释掉这行,或者把红框1的函 ...

  5. Spark Streaming 入门

    概述 什么是 Spark Streaming? Spark Streaming is an extension of the core Spark API that enables scalable, ...

  6. 23种设计模式之责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式. ...

  7. 今天第一次解决了程序在未装VS和XP下运行的问题

    http://www.cnblogs.com/zero5/p/3162948.html  一位素不相识的朋友做的代码雨屏保程序 - 残雪孤侠 - 博客园   上面是我的BLOG 群共享里,有程序和代码 ...

  8. 使用Thymeleaf给前端绑定值

    1.pom依赖 <!-- thymeleaf --> <dependency> <groupId>org.springframework.boot</grou ...

  9. java实现图片验证码

    一.验证码生成类 package hbi.tech.utils; import javax.imageio.ImageIO; import java.awt.*; import java.awt.im ...

  10. H5刮刮卡效果

    效果图: 核心就是使用ctx.globalCompositeOperation = 'destination-out'; 全部代码: <!DOCTYPE html> <html> ...