Zend Engine "zend_language_scanner.l"

ustas

Элекомист №1
Zend Engine "zend_language_scanner.l"

на с++ не пишу, но для общего развития хочу понять как идет синтактический разбор. В общем понятно как работает, но вопросы есть.
zend_language_scanner.l
PHP:
LNUM	[0-9]+
DNUM	([0-9]*[\.][0-9]+)|([0-9]+[\.][0-9]*)
EXPONENT_DNUM	(({LNUM}|{DNUM})[eE][+-]?{LNUM})
HNUM	"0x"[0-9a-fA-F]+
LABEL	[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
WHITESPACE [ \n\r\t]+
TABS_AND_SPACES [ \t]*
TOKENS [;:,.\[\]()|^&+-/*=%!~$<>?@]
ENCAPSED_TOKENS [\[\]{}$]
ESCAPED_AND_WHITESPACE [\n\t\r #'.:;,()|^&+-/*=%!~<>?@]+
ANY_CHAR (.|[\n])
NEWLINE ("\r"|"\n"|"\r\n")

%option noyylineno
%option noyywrap
%%

строка 1407
<INITIAL>"<%="|"<?="
не могу понять как это работает, это макрос так определен? и как понять откуда берется "<%="|"<?="
 

AnToXa

prodigy-одаренный ребенок
это описание (часть, насколько я вижу) граматики, по которому потом строится парсер.

инструменты:
flex (лексер, выделяет лексемы из потока символов): http://www.gnu.org/software/flex/manual/
bison (генератор парсеров, генерит код парсера на некотором языке программирования): http://www.gnu.org/software/bison/
 

HraKK

Мудак
Команда форума
Непонял?
Написано четко инициализация при <%= или <?= в чем проблемс?
Извините если туплю!
 

tony2001

TeaM PHPClub
INITIAL - это просто одно из состояний (states) сканера.

>не могу понять как это работает, это макрос так определен?
>и как понять откуда берется "<%="|"<?="

в переводе на человекопонятный язык это означает примерно следующиее:
если мы в первоначальном состоянии, то при встрече символов "<%="|"<?=" следует проверить включены ли asp_tags & short_tags; если да, то переходим в состояние ST_IN_SCRIPTING; если нет, то считаем, что это просто HTML.
 

ustas

Элекомист №1
tony2001 спасибо.
навеено это интересным фактом.

Код:
for (){
    if (exp) {
        continue; 
   }else {
       if (exp) {

       }
       switch(exp) {
           ..........
       }
    }
}
работает существенно быстрее (при многократных вызовах > 100 и более) чем

Код:
for (){
    if (exp) {
        continue; 
   }
   if (exp) {

   }
   switch(exp) {
      .......
   }
}
при одинаковом результате,
байт код попробую понять и сравнить
 

tony2001

TeaM PHPClub
>работает существенно быстрее

тебе кажется.
и байткод там сравнивать без толку - он делает JMP в начало цикла при continue в обоих случаях, остальной код не выполняется (если условие в первом if() - true).

>(при многократных вызовах > 100 и более) чем

на 10000000 циклов не вижу абсолютно никакой разницы; что там, что там - 4.5 сек.
100 вызовов - это вообще миллионные доли секунды, их нельзя сравнивать, т.к. погрешность может быть в разы больше.
 

ustas

Элекомист №1
мда, в очередной раз убедился что замеры с включенным xdebug смотреть не стоит.
 

ustas

Элекомист №1
tony2001,
zend_language_parser.output - это правила разбора? как их понимать?

'&' (38) 81 104 139 140 143 144 153 156 204 206 235 385 386 387 388 это возможные переходы?
а также в массивах zend_language_parser.c и т.п. ?
 
[offtop]
замечаю что в последнее время участились такие-вот случаи :), радует что есть люди которым интересно. особенно радует что есть люди которые могут отвечать на такие вот вопросы :). хотелось бы, что бы все это стало более систематизировано-организованным, может пора создать новый раздел :)?
[/offtop]
 

tony2001

TeaM PHPClub
>zend_language_parser.output - это правила разбора? как их понимать?

это какой-то служебный вывод, понимать его не надо, понимать надо .y

из Makefile.am:
zend_language_parser.c: $(srcdir)/zend_language_parser.y
$(YACC) -p zend -v -d $(srcdir)/zend_language_parser.y -o zend_language_parser.c
из man yacc:
-b file_prefix
Use file_prefix instead of y as the prefix for all output filenames. The code file y.tab.c, the header file y.tab.h (created when -d is specified), and the description file y.output (created when -v is specified), shall be changed to file_prefix .tab.c, file_prefix .tab.h, and file_prefix .output, respectively.
-v Write a file containing a description of the parser and a report of conflicts generated by ambiguities in the grammar.
 
Сверху