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 标记。