PHP5.1.4源代码深入解析

互联网 | 编辑: 宋杰 2007-02-01 00:00:00转载-投稿 一键看全文

PHP源代码分析(2)

十一. PHP的语法树?

1. Lex与Yacc

市面上有这本书。大家可以买来看看,包括GCC都是用它们兄弟生成的语法树。如果对编译器感兴趣。可以翻阅市面上关于这方面的书,并不多就几本。

2. y语法树文件

./Zend/zend_language_scanner.l与./Zend/zend_language_parser.y 规定了PHP的语法。从字面意义上scanner表示语法初步扫描, parser表示语法解析。根据这两个文件lex与yacc可以生成对应的c代码。所以相对来说生成语法是很方便的。

3. 如何定义一个符号

例如 if($language='php') 这一句中的if 就是一个token 语法中我们用T_IF表示。

具体在.l文件中如下定义了:
<ST_IN_SCRIPTING>"if" {
return T_IF;
}
这样.php文件中的if就会被翻译成内置符号T_IF。’(单引号)被如下定义:
<ST_SINGLE_QUOTE>['] {
BEGIN(ST_IN_SCRIPTING);
return '\'';
}

4. 复合符号例如最常见的变量命名$discuz_user, $submit 等。
<ST_IN_SCRIPTING,ST_DOUBLE_QUOTES,ST_HEREDOC,ST_BACKQUOTE>"$"{LABEL} {
zend_copy_value(zendlval, (yytext+1), (yyleng-1));
zendlval->type = IS_STRING;
return T_VARIABLE;
}

5. 一个有效的if语句过程
这个定义在zend_language_parser.y 189行:
T_IF '(' expr ')' {
zend_do_if_cond(&$3, &$4 TSRMLS_CC);
} statement {
zend_do_if_after_statement(&$4, 1 TSRMLS_CC);
} elseif_list else_single {
zend_do_if_end(TSRMLS_C);
}
| T_IF '(' expr ')' ':' {
zend_do_if_cond(&$3, &$4 TSRMLS_CC);
} inner_statement_list {
zend_do_if_after_statement(&$4, 1 TSRMLS_CC);
} new_elseif_list new_else_single T_ENDIF ';' {
zend_do_if_end(TSRMLS_C);
}

if 后面必须存在(),圆括弧里面是表达式 expr 表达式在734行被定义:
expr:
r_variable { $$ = $1; }
| expr_without_variable { $$ = $1; }
;

if 后面可以跟 elseif 语句及 else 语句。

从语法树里面我们看出 if () 后面是可以跟 : 的,这一般很少被使用吧。

6. 优先级和左右结合性

一般情况下.y文件中最先定义的操作符优先级相对低,并且可以使用%left、%right 进行描述左右结合性,例如:
%left '+' '-' '.'
%left '*' '/' '%'
%right '!'

这说明'!'在 PHP 语法中是右结合的, '*' '/' '%' '+' '-' '.' 是左结合的,并且'!'的优先级更高

例如语法 !$a + $b 要先计算 !$a 在进行加法操作%left ',' 被放在最上面定义,说明他的优先级最低,因为我们知道','可以等同一个语句。

7. php.ini的解析

1). 如果规定数值正负?

<INITIAL>[ ]*("true"|"on"|"yes")[ ]* {
ini_lval->value.str.val = zend_strndup("1", 1);
ini_lval->value.str.len = 1;
ini_lval->type = IS_STRING;
return CFG_TRUE;
}

<INITIAL>[ ]*("false"|"off"|"no"|"none")[ ]* {
ini_lval->value.str.val = zend_strndup("", 0);
ini_lval->value.str.len = 0;
ini_lval->type = IS_STRING;
return CFG_FALSE;
}

十二. 从 CVS 获取 PHP 源代码

1. 安装 CVS 版本工具,例如 TortoiseCVS。

2. cvs -d :pserver:cvsread@cvs.php.net:/repository checkout php-src 具体的CVS使用办法请参考 CVS 手册及其它著作。

PHP.ini 文件的默认配置,定义在 ./main/main.c 342行

-- ./main/main.c -- 342:

/* {{{ PHP_INI
*/
PHP_INI_BEGIN()
PHP_INI_ENTRY_EX("define_syslog_variables", "0", PHP_INI_ALL, NULL,

php_ini_boolean_displayer_cb)
PHP_INI_ENTRY_EX("highlight.bg", HL_BG_COLOR, PHP_INI_ALL, NULL,

php_ini_color_displayer_cb)
PHP_INI_ENTRY_EX("highlight.comment", HL_COMMENT_COLOR, PHP_INI_ALL, NULL,

php_ini_color_displayer_cb)
PHP_INI_ENTRY_EX("highlight.default", HL_DEFAULT_COLOR, PHP_INI_ALL, NULL,

php_ini_color_displayer_cb)
PHP_INI_ENTRY_EX("highlight.html", HL_HTML_COLOR, PHP_INI_ALL, NULL,

php_ini_color_displayer_cb)
PHP_INI_ENTRY_EX("highlight.keyword", HL_KEYWORD_COLOR, PHP_INI_ALL, NULL,

php_ini_color_displayer_cb)
PHP_INI_ENTRY_EX("highlight.string", HL_STRING_COLOR, PHP_INI_ALL, NULL,

php_ini_color_displayer_cb)

more lines ... ...

PHP_INI_END()
/* }}} */

-- ./main/main.c --

在最新版本的PHP中 memory_limit 由原来的 8M 修改成了 16M

来做个简单结尾吧:跟着作者的思路边读边看源文件的,感觉真的很好!相信很多朋友也跟我一样!如果喜欢这类PHP文章,还可以到Zend中国官方网站phpchina.com去。

提示:试试键盘 “← →” 可以实现快速翻页 

总共 2 页< 上一页12
一键看全文

本文导航

相关阅读

每日精选

点击查看更多

首页 手机 数码相机 笔记本 游戏 DIY硬件 硬件外设 办公中心 数字家电 平板电脑