PHP关键字异构化实验

PHP词法分析和语法分析

简单理解PHP代码执行过程:http://blog.csdn.net/risingsun001/article/details/22888861

PHP编译执行基本过程如下图:

目前PHP词法分析器采用re2c规则,在PHP源码中的位置是zend/zend_language_scanner.c,它是由词法规则文件zend_language_scanner.l经过re2c编译生成的,命令如下:

re2c –o zend_language_scanner.c zend_language_scanner.l

PHP语法分析器用bison来生成,在PHP源码中的位置是zend/zend_language_parser.c,它是由语法规则文件zend_language_parser.y经过bison编译生成,命令如下:

bison –o zend_language_parser.c zend_language_parser.y

zend虚拟机负责执行生成的opcode。

具体相关内容参考:http://rapheal.sinaapp.com/2013/11/20/php_zend_hello_world/

怎么构建自己的PHP语法规则

首先参考这一篇博文:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1806405&highlight=&page=1

下面以将echo异构化为echo1为例进行介绍。首先修改zend_language_scanner.l文件,如下图所示,在返回标志符T_ECHO的地方将echo改为echo1。

再修改语义解析文件zend_language_parser.y,如下图所示,在token是T_ECHO的地方将表示修改为“echo1 (T_ECHO)”。

最后删除zend目录下的zend_language_scanner.c和zend_language_parser.c两个文件,重新编译安装PHP即可。

参考资料

  1. http://www.codesec.net/view/455473.html
  2. http://www.phppan.com/2011/09/php-lexical-re2c/
  3. http://tina.reeze.cn/book/?p=chapt02/02-03-01-lex-and-yacc
  4. http://blog.csdn.net/ghostlv/article/details/51277994
  5. http://blog.csdn.net/newjueqi/article/details/7689904
  6. http://tina.reeze.cn/book/?p=G-re2c-mannual
  7. http://blog.csdn.net/risingsun001/article/details/22888861
  8. http://www.laruence.com/2008/06/18/221.html

做自己的PHP语法解释器的更多相关文章

  1. 自己动手做 UEStudio/UltraEdit 的语法高亮文件 (*.uew)

    自己一直比较习惯用 UEStudio 来编写 C/C++ 文件,因为 Visual Studio 2010 实在太大了,我的 T400 都跑的费劲,所以一般我只用它来编译和调试.但是可惜的是 UESt ...

  2. Babel运行原理

    前言     之前翻博客园的时候,看到有人朋友分享阿里巴巴的面试题,其中有一道题就是关于ES6转ES5 原理的,当时我看到感觉到自己离去阿里巴巴的路还很远啊,像我们大部分做开发的时候,都只知其然不知 ...

  3. atitit.java解析sql语言解析器解释器的实现

    atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...

  4. 学习笔记——解释器模式Interpreter

    解释器模式,其实就是编译原理中的语法解释器,如果用在项目中,可以用于实现动态脚本的解析,也就是说项目可以支持用户脚本扩展. 但实际上,这种运行时解释,效率很慢,如果不是很需要的话,不建议使用. 一种简 ...

  5. 【设计模式】—— 解释器模式Interpret

    前言:[模式总览]——————————by xingoo 模式意图 自定义某种语言后,给定一种文法标准,定义解释器,进行解析. 做过搜索的朋友们可能更了解一些,平时我们搜索所需要的词库,通常就需要用这 ...

  6. java设计模式-----16、解释器模式

    概念: Interpreter模式也叫解释器模式,是行为模式之一,它是一种特殊的设计模式,它建立一个解释器,对于特定的计算机程序设计语言,用来解释预先定义的文法.简单地说,Interpreter模式是 ...

  7. python接口测试自动化之python基础语法

    一.pycharm的使用和python基本语法 (一).pycharm的使用和python环境 1.python以及pycharm的安装 python 的版本选择:3.x 版本,不要安装2.x 版本, ...

  8. Objective-C 【点语法】

    ------------------------------------------- 点语法的使用 // //  点语法的使用 // //  点语法:   xcode的一种特性,xcode帮我们做代 ...

  9. ES6的介绍和常用语法

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 前言 ECMAScript 是 JS 的语言标准.而 ES6 是新的 J ...

随机推荐

  1. java根据HashMap中的值将其元素排序

    思路:HashMap或Map本身没有排序功能,若要进行较轻松的排序,可利用ArrayList中的sort方法 例子: import java.util.ArrayList; import java.u ...

  2. Struts2.5简单使用入门

    今天学了Struts2.5最新版的,老师在黑板上讲的很是简单,也很是容易,简单的就实现了.可是课下让我们自己弄,自己无论如何都无法运行成功,一直提示404.偶然间灵机一动,改了一下那个文件就好了.希望 ...

  3. javascript与jQuery选项卡效果

    HTML结构: <!doctype html><html><head><meta charset="utf-8"><title ...

  4. 【Flex】读取本地JSON,然后JSON数据转成XML数据

    package utils { import flash.xml.XMLDocument; import flash.xml.XMLNode; import mx.rpc.xml.SimpleXMLE ...

  5. php调试之路

    解析php中die(),exit(),return的区别 die()停止程序运行,输出内容exit是停止程序运行,不输出内容return是返回值die是遇到错误才停止exit是直接停止,并且不运行后续 ...

  6. Myeclipse8.5开发-安装一:Myeclipse8.5注册码生成程序

    环境:Myeclipces8.5 1.安装Myeclipces8.5. 2.打开Myeclipces新建任意项目. 3.新建MyEclipseKeyGen.java类.点击运行,控制台输入您的注册名, ...

  7. 635B. Bear and Compressing

    B. Bear and Compressing time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  8. javascript里的几种常见的数组方法

    Array()的几种方法 1.splice(2,3,4)删除数组中任意项(三个参数). 2.splice(1,3)删除从第一项开始的往后三项(两个参数).(splice可以结合pop(),unshif ...

  9. RabbitMQ-从基础到实战(6)— 与Spring集成

    0.目录 RabbitMQ-从基础到实战(1)- Hello RabbitMQ RabbitMQ-从基础到实战(2)- 防止消息丢失 RabbitMQ-从基础到实战(3)- 消息的交换(上) Rabb ...

  10. [Paxos] Paxos Made Simple 读后感

    Paxos 由著名图灵奖获得者Leslie Lamport提出,该算法是分布式一致性算法中的奠基之作,今天初读此文仅将相关学习心得予以记录. 1.Paxos 是什么?主要用来解决什么问题? Paxos ...