当前位置: 首页 > 后端技术 > PHP

【PHP7源码学习】2019-03-20PHP词法分析

时间:2023-03-29 22:27:32 PHP

baiyan所有视频:https://segmentfault.com/a/11...原视频地址:http://replay.xesv5.com/ll/24...基本概念在PHP7中,当脚本运行请求或到达时,PHP代码会先被加载到内存中,然后进行词法分析和语法分析,生成抽象语法树(AST),然后深度-首先遍历并生成操作码,并在zend虚拟机中执行这些操作码,返回最终的执行结果。词法分析:这是编译过程的第一阶段。这个阶段会把代码从左到右按字符扫描读入,然后把代码分成一个个token,方便后续的语法分析、编译优化等操作。这就好比用菜刀切一块肉,把这块大肉切成小块,供以后的人吃。我们可以使用Re2c、lex等自动词法分析工具来帮助我们完成。语法分析:语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将词法单元标记组合成各种语法短语,如“程序”、“语句”、“表达式”等,可以判断源程序的结构是否正确。在PHP中,使用的词法分析器是Re2c,解析器是Bison。实际上,进行词法分析和语法分析并生成一定数据结构的过程就是一个解码过程。之所以需要这种从字符串到数据结构(AST)的转换,是因为编译器不能直接操作像“1+2”这样的字符串。其实代码的本质根本不是字符串,它是一个拓扑复杂的数据结构,就像电路一样。字符串“1+2”只是这个数据结构的一种“编码”,就像ZIP或者JPEG只是它们压缩后的数据的一种编码。这种编码方便你把代码保存到磁盘,也方便你用文本编辑器修改它们(对人友好,方便人们写代码,但对编译器不友好),但是你必须知道文本不是代码本身。所以从磁盘读取文本后,必须先对其进行“解码”,这样才能方便地操作代码的数据结构。比如上面Java代码生成的AST节点叫做node,可以用node.operator访问加号ADD,用node.left访问1,用node.right访问2,这样很方便.对于编程语言,这种解码动作称为解析,用于解码的代码称为解析器。关于语法分析和词法分析的具体概念解释,这篇文章写的很好:Parser的误区,我们先用PHP内置函数token_get_all()提取一段PHP代码的token: