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

发布时间:2019-08-06 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了PHP-7.1 源代码学习:词法分析脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

前言

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

总结

脚本宝典总结

以上是脚本宝典为你收集整理的PHP-7.1 源代码学习:词法分析全部内容,希望文章能够帮你解决PHP-7.1 源代码学习:词法分析所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。