Как Zend распознает переменную, указав префикс доллара при ее анализе?

В настоящее время я знаю, как Zend анализирует операторы, прочитав Zend / zend_language_parser.y файл php-src. Но меня очень смущает, как распознаются переменные.

Жетон бизона:

%token <ast> T_VARIABLE  "variable (T_VARIABLE)"

Как это соответствует префиксу доллара?

0

Решение

Объявление токена говорит нам, что есть тип токена с именем 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 маркер.

2

Другие решения

Других решений пока нет …