php 编译原理,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

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值