рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХрднреА рд╕реЛрдЪрд╛ рд╣реИ рдХрд┐ PHP рдХреЗ рдореВрд▓ рдХреЛ рдХреИрд╕реЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдП? рдирдпрд╛ рдХреАрд╡рд░реНрдб рдмрдирд╛рдиреЗ рдпрд╛ рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ? рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реА рднрд╛рд╖рд╛ рдХрд╛ рдмреБрдирд┐рдпрд╛рджреА рдЬреНрдЮрд╛рди рд╣реИ, рддреЛ рдЫреЛрдЯреЗ рдмрджрд▓рд╛рд╡ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╣рд╛рдВ, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рд╡реНрдпрд░реНрде рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ - рдпрд╣ рд╕рдм рдХреЗ рдмрд╛рдж рдордЬрд╛рдХрд┐рдпрд╛ рд╣реИред
рдЪрд▓реЛ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХрд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ PHP рдореЗрдВ рдХрд┐рд╕рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ:
<?php class ClassName {}
рд╣рдо рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╕рд░рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рдХреЗ рд╕рд╛рде рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
<?php class ClassName;
рдпрджрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрдЧрд╛ред рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд╣рд▓рд╛ рдХрджрдо рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИред
$ sudo apt-get install bison re2c
PHP рдХреЛ C рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди Parison рдХреЛ Bison рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдмрд╛рдЗрд╕рди рдПрдХ рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рд╣реИред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рд╛рдЗрдЯ рдЗрд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИ рдЬреЛ рдПрдХ рдЯреИрдЧ рдХрд┐рдП рдЧрдП рд╕рдВрджрд░реНрдн-рдореБрдХреНрдд рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдПрдХ рдирд┐рдпрддрд╛рддреНрдордХ LR рдпрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд LR (GLR) рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдореЗрдВ LALR рдкрд╛рд░реНрд╕рд░ рддрд╛рд▓рд┐рдХрд╛рдУрдВ (рд▓реБрдХ-рдЕрд╣реЗрдб LR рдкрд╛рд░реНрд╕рд░ - рд▓рдЧрднрдЧред) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреА рд╣реИред
рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдкреВрд░реА рдХрд┐рддрд╛рдм рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣
рджреВрдВрдЧрд╛ ред рдпрд╣ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдЕрдЪреНрдЫреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рдФрд░ рдЕрдЧрд░ рдЖрдк рдХрднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓реЙрдиреНрдЪрд┐рдВрдЧ рдкреИрдб рдмрди рд╕рдХрддрд╛ рд╣реИред
рдЕрдм
http://php.net рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдирд╡реАрдирддрдо PHP рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред
$ tar xvjf php-5.4.14.tar.bz2 $ cd php-5.4.14 $ ./configure $ cd Zend $ ls
рдЕрдкрдиреА рдЯреЛрдкреА рдЙрддрд╛рд░ рджреЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ PHP рдХрд╛ рдореВрд▓ рд╣реИред рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХреЛрдб рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡реЗрдм рд╕рд░реНрд╡рд░реЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕рдХрд╛ рдЕрдиреНрд╡реЗрд╖рдг рдХрд░реЗрдВред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, "y" рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдЗрд╕рди рдЬрдирд░реЗрдЯрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
$ ls *.y zend_ini_parser.y zend_language_parser.y
рд╣рдо "ini" рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЧрдбрд╝рдмрдбрд╝ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ "zend_language_parser.y" рд╣реА рд░рд╣рддрд╛ рд╣реИред рдЗрд╕реЗ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рд╕рдВрдкрд╛рджрдХ рдХреЗ рд╕рд╛рде рдЦреЛрд▓реЗрдВред
рдЕрдм, рдпрджрд┐ рдЖрдк "рд╡рд░реНрдЧ" рд╢рдмреНрдж рдЦреЛрдЬрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
%token T_CLASS "class (T_CLASS)"
рдкрд╛рд░реНрд╕рд░ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИред рдХреНрд▓рд╛рд╕ рдХрд╛ рдЯреЛрдХрди "
T_CLASS " рд╣реИред рдпрджрд┐ рдЖрдк рдкрд╛рда рдореЗрдВ "
T_CLASS "
рдЦреЛрдЬрддреЗ рд╣реИрдВ , рддреЛ рдЖрдкрдХреЛ рдХреБрдЫ рд╕рдорд╛рди рдорд┐рд▓реЗрдЧрд╛:
class_entry_type: T_CLASS { $$.u.op.opline_num = CG(zend_lineno); $$.EA = 0; } | T_ABSTRACT T_CLASS { $$.u.op.opline_num = CG(zend_lineno); $$.EA = ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; } | T_TRAIT { $$.u.op.opline_num = CG(zend_lineno); $$.EA = ZEND_ACC_TRAIT; } | T_FINAL T_CLASS { $$.u.op.opline_num = CG(zend_lineno); $$.EA = ZEND_ACC_FINAL_CLASS; } ;
рдпрд╣рд╛рдБ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЪрд╛рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╣реИрдВред
- рд╡рд░реНрдЧ (рд╡рд░реНрдЧ)
- рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ
- рд╡рд┐рд╢реЗрд╖рддрд╛ (рд╡рд┐рд╢реЗрд╖рддрд╛)
- рдЕрдВрддрд┐рдо (рдкрддреНрддреА, рдЕрдВрддрд┐рдо) рд╡рд░реНрдЧ (рдЕрдВрддрд┐рдо рд╡рд░реНрдЧ)
рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдореЗрдВ, рдЖрдк рдХрдИ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдХреЗрд╡рд▓ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред рдЪрд▓реЛ рдЙрдиреНрд╣реЗрдВ рдЫреВрдирд╛ рдирд╣реАрдВ рд╣реИред
рд╣рдо рд╕рд╣реА рд░рд╛рд╕реНрддреЗ рдкрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╡рд╛рдХреНрдпрд╛рдВрд╢ "class_entry_type" рджреЗрдЦреЗрдВ рдЬреЛ рдЙрди рдЪрд╛рд░ рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд╡рд╣ рдЖрдкрдХреЛ рдЖрдкрдХреА рдордВрдЬрд┐рд▓ рддрдХ рдкрд╣реБрдВрдЪрд╛рдПрдЧреАред рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕реЗ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
unticked_class_declaration_statement: class_entry_type T_STRING extends_from { zend_do_begin_class_declaration(&$1, &$2, &$3 TSRMLS_CC); } implements_list '{' class_statement_list '}' { zend_do_end_class_declaration(&$1, &$3 TSRMLS_CC); } | interface_entry T_STRING { zend_do_begin_class_declaration(&$1, &$2, NULL TSRMLS_CC); } interface_extends_list '{' class_statement_list '}' { zend_do_end_class_declaration(&$1, NULL TSRMLS_CC); } ;
рдпрд╣рд╛рдВ рджреЛ рд╡рд┐рдЬреНрдЮрд╛рдкрди рд╣реИрдВред рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдПред рд╣рдо рдкрд╣рд▓реЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдпрд╣ "
class_entry_type " рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: рд╡рд░реНрдЧ | рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ | рд╡рд┐рд╢реЗрд╖рддрд╛ | рдЕрдВрддрд┐рдо рд╡рд░реНрдЧред рдЕрдЧрд▓рд╛ рддрддреНрд╡
T_STRING рдЯреЛрдХрди рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо рдЕрдкрдиреА рдЬрдЧрд╣ рдкрд░ рд╣реЛрдЧрд╛ред "
extends_from " рдПрдХ рд╕рдореВрд╣ рд╣реИред рдЗрд╕ рдЖрдЗрдЯрдо рдХреЛ T_STRING рдпрд╛ рдЦрд╛рд▓реА рдЦрд╛рд▓реА рдЬрдЧрд╣ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрд╕рдХреЗ рдмрд╛рдж, рд╡рд░реНрдЧ рдШреЛрд╖рдгрд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд░ Zend рдЗрдВрдЬрди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
{ zend_do_begin_class_declaration(&$1, &$2, &$3 TSRMLS_CC); }
рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ
zend_compiler.c рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
void zend_do_begin_class_declaration(const znode *class_token, znode *class_name, const znode *parent_class_name TSRMLS_DC)
рдпрд╣рд╛рдБ рдкрд╣рд▓рд╛ рддрд░реНрдХ рдХрдХреНрд╖рд╛ "
class_entry_type " рдХрд╛ рдЯреЛрдХрди рд╣реИ, рджреВрд╕рд░рд╛ рд╡рд░реНрдЧ "
T_STRING " рдХрд╛ рдирд╛рдо рд╣реИ, рдФрд░ рдЕрдВрддрд┐рдо "
extends_from " рдХрд╛ рдореВрд▓ рд╡рд░реНрдЧ рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд implements_list рд╕рдореВрд╣ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред рд╕рдЪ рд╣реИ, рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдХрдХреНрд╖рд╛ рдХрд╛ рдЖрд╡рд╢реНрдпрдХ рдирд┐рдХрд╛рдп рдмрдирд╛рддреА рд╣реИрдВ: рдЙрджреНрдШрд╛рдЯрди рдмреНрд░реЗрд╕ "
{ ", рд╕рдореВрд╣ "
рдХреНрд▓рд╛рд╕_рд╕реНрдЯреИрдЯрдореЗрдВрдЯ_рд▓рд┐рд╕реНрдЯ " рдФрд░ рд╕рдорд╛рдкрди рдмреНрд░реЗрд╕ "
} "ред рдЕрдВрдд рдореЗрдВ, рдкрд╛рд░реНрд╕рд░ Zend рдЗрдВрдЬрди рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрдХреНрд╖рд╛ рдХреА рдШреЛрд╖рдгрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рд╣реИред
{ zend_do_end_class_declaration(&$1, &$3 TSRMLS_CC); }
рд╣рдореЗрдВ рдЗрд╕ рдХреЛрдб рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд░реНрдЧ рдирд┐рдХрд╛рдп рдХреЗ рдмрд┐рдирд╛ред
unticked_class_declaration_statement: class_entry_type T_STRING extends_from { zend_do_begin_class_declaration(&$1, &$2, &$3 TSRMLS_CC); } ';' { zend_do_end_class_declaration(&$1, &$3 TSRMLS_CC); } | class_entry_type T_STRING extends_from { zend_do_begin_class_declaration(&$1, &$2, &$3 TSRMLS_CC); } implements_list '{' class_statement_list '}' { zend_do_end_class_declaration(&$1, &$3 TSRMLS_CC); } | interface_entry T_STRING { zend_do_begin_class_declaration(&$1, &$2, NULL TSRMLS_CC); } interface_extends_list '{' class_statement_list '}' { zend_do_end_class_declaration(&$1, NULL TSRMLS_CC); } ;
рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рдерд╛, рд╣реИ рдирд╛? рдЕрдм рдЖрдкрдХреЛ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВред
$ cd .. $ make
рдкрд╣рд▓рд╛ рд╕рдВрдХрд▓рди рд╣рдореЗрд╢рд╛ рдХреБрдЫ рд╕рдордп рд▓реЗрддрд╛ рд╣реИред
$ vim test.php
рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рджрд░реНрдЬ рдХрд░реЗрдВред
<?php class FooBar; $a = new FooBar; $a->bar = 10; print_r($a);
рдЕрдм рдЗрд╕реЗ рдЯреЗрд╕реНрдЯ рдХрд░реЗрдВред
$ sapi/cli/php test.php FooBar Object ( [bar] => 10 )
рдорд╣рд╛рди, рдЖрдкрдиреЗ рдпрд╣ рдХрд┐рдпрд╛!
рдЪрд▓реЛ рдХреБрдЫ рдФрд░ рдХрд░рддреЗ рд╣реИрдВред PHP рдореЗрдВ, рдЖрдк "
рдХреНрд▓рд╛рд╕ " рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡рд░реНрдЧ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕реЗ рдХрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "
cls " рдХрд░реЗрдВрдЧреЗред
рд╣рдо lexer рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
$ cd Zend/ $ ls *.l zend_ini_scanner.l zend_language_scanner.l
рдЯреЛрдХрди рдкрд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рдмрд╛рдЗрд╕рди рдлрд╝рд╛рдЗрд▓ред рд▓реЗрдХреНрд╕рд░ рдЖрдкрдХреЛ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рдЯреЛрдХрди рдореЗрдВ рдХреИрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред Zend_language_scanner.l рдЦреЛрд▓реЗрдВ рдФрд░ "
рд╡рд░реНрдЧ " рд╢рдмреНрдж рдЦреЛрдЬреЗрдВред
<ST_IN_SCRIPTING>"class" { return T_CLASS; }
рдЗрд╕ рдмреНрд▓реЙрдХ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░реЗрдВ рдФрд░ рд╡рд░реНрдЧ рдХреЛ cls рдореЗрдВ рдмрджрд▓реЗрдВред
<ST_IN_SCRIPTING>"cls" { return T_CLASS; } <ST_IN_SCRIPTING>"class" { return T_CLASS; }
рдХрд╛рдо рд╣реЛ рдЧрдпрд╛ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЖрдк "
рд╡рд░реНрдЧ " рдХреЗ рдмрдЬрд╛рдп "
cls " рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рдпрд╣ рдордЬрд╝реЗрджрд╛рд░ рдирд╣реАрдВ рд╣реИ? рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕рдХрд╛ рдЬрд┐рддрдирд╛ рдЖрдирдВрдж рдЙрдард╛рдпрд╛ рд╣реИ, рдЙрддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред рд░реБрдЪрд┐ рд▓реЗрдВ, рдЕрдиреНрд╡реЗрд╖рдг рдХрд░реЗрдВред рдФрд░ рдЕрдЧрд░ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ
https://bugs.php.net/ рдкрд░ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред