Zend 在解析变量时如何通过指定美元前缀来识别变量?
How does Zend recognize a variable by specify the dollar prefix when parse it?
我目前通过阅读 php-src 的 Zend/zend_language_parser.y 文件知道 Zend 是如何解析运算符的。但是我对如何识别变量感到很困惑。
Bison 代币是:
%token <ast> T_VARIABLE "variable (T_VARIABLE)"
如何匹配美元前缀?
令牌声明告诉我们有一个名为 T_VARIABLE
的令牌类型与类型 ast
的值关联,在错误消息中应称为 "variable (T_VARIABLE)"。它没有告诉我们 T_VARIABLE
标记可能包含哪些字符 - Bison 文件中没有任何内容会告诉我们。
那是因为 Bison 解析器不与字符交互 - 它与 lexer/scanner 生成的标记交互。解析器仅使用扫描器生成的标记。它不需要知道哪个字符序列被翻译成哪个标记——这是扫描器的工作。
因此,如果您想查看美元符号,则需要查看扫描仪 (zend_language_scanner.l),您会在其中找到(除其他外)this:
<ST_IN_SCRIPTING,ST_DOUBLE_QUOTES,ST_HEREDOC,ST_BACKQUOTE,ST_VAR_OFFSET>"$"{LABEL} {
RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
这告诉我们在常规 PHP 部分、双引号、heredocs、反引号和方括号(即除了 <?php
标签之外的任何地方),一个美元后跟一个标签 (它被定义为不以数字开头的任意非空字母、数字和下划线序列)产生一个 T_VARIABLE
标记。
我目前通过阅读 php-src 的 Zend/zend_language_parser.y 文件知道 Zend 是如何解析运算符的。但是我对如何识别变量感到很困惑。
Bison 代币是:
%token <ast> T_VARIABLE "variable (T_VARIABLE)"
如何匹配美元前缀?
令牌声明告诉我们有一个名为 T_VARIABLE
的令牌类型与类型 ast
的值关联,在错误消息中应称为 "variable (T_VARIABLE)"。它没有告诉我们 T_VARIABLE
标记可能包含哪些字符 - Bison 文件中没有任何内容会告诉我们。
那是因为 Bison 解析器不与字符交互 - 它与 lexer/scanner 生成的标记交互。解析器仅使用扫描器生成的标记。它不需要知道哪个字符序列被翻译成哪个标记——这是扫描器的工作。
因此,如果您想查看美元符号,则需要查看扫描仪 (zend_language_scanner.l),您会在其中找到(除其他外)this:
<ST_IN_SCRIPTING,ST_DOUBLE_QUOTES,ST_HEREDOC,ST_BACKQUOTE,ST_VAR_OFFSET>"$"{LABEL} {
RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
}
这告诉我们在常规 PHP 部分、双引号、heredocs、反引号和方括号(即除了 <?php
标签之外的任何地方),一个美元后跟一个标签 (它被定义为不以数字开头的任意非空字母、数字和下划线序列)产生一个 T_VARIABLE
标记。