做自己的 PHP 语法解释器

1,242 阅读1分钟
原文链接: mp.weixin.qq.com

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。

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

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

首先参考这一篇博文: bbs.chinaunix.net/forum.php?m…

下面以将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. www.codesec.net/view/455473…

  2. www.phppan.com/2011/09/php…

  3. tina.reeze.cn/book/?p=cha…

  4. blog.csdn.net/ghostlv/art…

  5. blog.csdn.net/newjueqi/ar…

  6. tina.reeze.cn/book/?p=G-r…

  7. blog.csdn.net/risingsun00…

  8. www.laruence.com/2008/06/18/…