资讯专栏INFORMATION COLUMN

PHP-7.1 源代码学习:词法分析

liuchengxu / 232人阅读

摘要:前言语法分析器调用获取词法单元,对于复杂的语言实现一般都会自定义,搜索的宏定义搜索函数的定义打开文件查看函数定义这里出现了两个新的数据类型,,从命名推测是语法分析栈元素语法分析树节点,搜索代码里面哪些地方引用了

前言 yylex

bison 语法分析器调用 yylex 获取词法单元,对于复杂的语言实现一般都会自定义 yylex,搜索 yylex 的宏定义

# grep -rin --color --include=*.h "#define yylex"
Zend/zend_language_parser.c:64:#define yylex zendlex

搜索 zendlex 函数的定义

# grep -rin --color --include=*.c zendlex
Zend/zend_language_parser.c:1689:int zendlex(zend_parser_stack_elem *elem)

打开 zend_language_parser.c 文件查看 zendlex 函数定义

int zendlex(zend_parser_stack_elem *elem) {
    zval zv;
    int retail;

    ...

again:
    ZVAL_UNDEF(&zv);
    retval = lex_scan(&zv);
    if (EG(Exception)) {
        return T_ERROR;
    }

    switch (retval) {
        ...
    }

    return retval;
}

这里出现了两个新的数据类型 zval,zend_parser_stack_elem,从命名推测 zend_parser_stack_elem 是语法分析栈元素(语法分析树节点),搜索代码里面哪些地方引用了 zend_parser_stack_elem

grep --color -rinw --include=*.c --include=*.h zend_parser_stack_elem
Zend/zend_compile.h:130:} zend_parser_stack_elem;
Zend/zend_language_parser.c:108:#define YYSTYPE zend_parser_stack_elem

打开 zend.compile.h 文件 130 行,zend_parser_stack_elem 是一个联合体的 typedef

typedef union _zend_parser_stack_elem {
    zend_ast *ast;
    zend_string *str;
    zend_ulong num;
} zend_parser_stack_elem;

zend_language_parser.c 文件的 108 行表明 zend_parser_stack_elem 是 词法分析模块 传递给 语法分析模块的 token value

总结

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30534.html

相关文章

  • PHP-7.1 代码学习:语法分析 之 概述

    摘要:前言使用和进行语法分析和词法分析,本文以语法定义文件为起点,使用等命令行工具搜索相关源码,以此来展示探索语法分析源码思路语法定义文件在源代码根目录下通过命令查找文件我们找到了文件,里面定义了脚本的语法语法分析树节点类型在查看具体的语法规则 前言 php 使用 lex 和 bison 进行语法分析和词法分析,本文以 bison 语法定义文件为起点,使用 find, grep 等命令行工具...

    luqiuwen 评论0 收藏0
  • PHP-7.1 代码学习php-cli 启动流程

    摘要:前言函数默认构建目标为,相关代码在目录下,文件中能够找到入口函数,大概流程如下命令行参数处理初始化清理工作语言系统编程常用手法,通过中声明函数指针类型的字段来实现类似面向对象中抽象类的概念,在文件中可以找到该结构体的定义,这里只列出部分 前言 php cli main 函数 configure & make 默认构建目标为 php-cli,相关代码在 sapi/cli 目录下,php_...

    VishKozus 评论0 收藏0
  • PHP-7.1 代码学习:字节码生成 之 "$a = 1"

    摘要:前言本文通过分析这个语句的编译和执行来窥探解释执行逻辑准备参考之前的系列文章,在环境下下载,编译源代码将代码导入中编辑运行选项,增加运行参数设置断点开始调试是一个测试脚本,放在目录下,中只包含一条简单的赋值语句调用堆栈参考之前的系列文章 前言 本文通过分析 $a=1 这个 PHP 语句的编译和执行来窥探 php-cli 解释执行逻辑 准备 参考之前的系列文章,在 ubuntu 环境下...

    ConardLi 评论0 收藏0
  • PHP-7.1 代码学习:字节码生成 之 概述

    摘要:前言字节码生成编译的代码主要集中在,文件中包含大量的函数,基本上一个函数对应语法规则文件一个非终结符,函数是所有函数的入口数据结构结构体是字节码抽象结构体并没有像名字那样简单,它包含了大量的字段供虚拟机在运行时使用一如既往的简单,直观,相比 前言 字节码生成(编译)的代码主要集中在 zend_compile.c ,文件中包含大量的 zend_compile_xxx 函数,基本上一个函数...

    1fe1se 评论0 收藏0
  • 使用PHP扩展Xhprof分析项目性能实践

    摘要:一背景项目即将上线,想通过一些工具来分析代码的稳定性和效率,想起在上个团队时使用过的扩展因为换了新电脑,所以需要重新编译此扩展,现将安装与实际排查过程完整记录下来,方便自己回顾和帮助更多的读者。作者汤青松微信日期 一、背景 项目即将上线,想通过一些工具来分析代码的稳定性和效率,想起在上个团队时使用过的xhprof扩展;因为换了新电脑,所以需要重新编译此扩展,现将安装与实际排查过程完整记...

    高胜山 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<