В настоящее время я знаю, как Zend анализирует операторы, прочитав Zend / zend_language_parser.y файл php-src. Но меня очень смущает, как распознаются переменные.
Жетон бизона:
%token <ast> T_VARIABLE "variable (T_VARIABLE)"
Как это соответствует префиксу доллара?
Объявление токена говорит нам, что есть тип токена с именем T_VARIABLE
что связано со значениями типа ast
и должен упоминаться как «переменная (T_VARIABLE)» в сообщениях об ошибках. Это ничего не говорит нам о том, какие персонажи T_VARIABLE
токен может состоять из — ничего в файле Bison нам не скажет.
Это потому, что парсер Bison не взаимодействует с персонажами — он взаимодействует с токенами, созданными лексером / сканером. Парсер просто использует токены, сгенерированные сканером. Не нужно знать, какая последовательность символов переведена на какие токены — это работа сканера.
Поэтому, если вы хотите увидеть знак доллара, вам нужно заглянуть в сканер (zend_language_scanner.l), где вы найдете (среди прочего) этот:
<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
маркер.
Других решений пока нет …