Index: Zend/zend_language_scanner.l =================================================================== --- Zend/zend_language_scanner.l (révision 25) +++ Zend/zend_language_scanner.l (révision 34) @@ -870,6 +870,10 @@ return T_CONST; } +"enum" { + return T_ENUM; +} + "return" { return T_RETURN; } Index: Zend/zend_language_parser.y =================================================================== --- Zend/zend_language_parser.y (révision 25) +++ Zend/zend_language_parser.y (révision 34) @@ -156,6 +156,7 @@ %token T_NS_C %token T_DIR %token T_NS_SEPARATOR +%token T_ENUM %% /* Rules */ @@ -185,6 +186,7 @@ top_statement_list '}' { zend_do_end_namespace(TSRMLS_C); } | T_USE use_declarations ';' { zend_verify_namespace(TSRMLS_C); } | constant_declaration ';' { zend_verify_namespace(TSRMLS_C); } + | enum_declaration ';' { zend_verify_namespace(TSRMLS_C); } ; use_declarations: @@ -204,6 +206,21 @@ | T_CONST T_STRING '=' static_scalar { zend_do_declare_constant(&$2, &$4 TSRMLS_CC); } ; +enum_declaration: + enum_declaration ',' { CG(enum_current_value) = 0; } '{' enum_inner_list '}' + | T_ENUM { CG(enum_current_value) = 0; } '{' enum_inner_list '}' +; + +enum_inner_list: + enum_inner_list ',' T_STRING enum_value { zend_do_declare_constant(&$3, &$4 TSRMLS_CC); } + | T_STRING enum_value { zend_do_declare_constant(&$1, &$2 TSRMLS_CC); } +; + +enum_value: + '=' T_LNUMBER { $$ = $2; CG(enum_current_value) = Z_LVAL($$.u.constant); } + | /* empty */ { $$.op_type = IS_CONST; INIT_PZVAL(&$$.u.constant); Z_TYPE($$.u.constant) = IS_LONG; Z_LVAL($$.u.constant) = ++CG(enum_current_value); } +; + inner_statement_list: inner_statement_list { zend_do_extended_info(TSRMLS_C); } inner_statement { HANDLE_INTERACTIVE(); } | /* empty */ @@ -529,6 +546,7 @@ class_statement: variable_modifiers { CG(access_type) = Z_LVAL($1.u.constant); } class_variable_declaration ';' | class_constant_declaration ';' + | class_enum_declaration ';' | trait_use_statement | method_modifiers function is_reference T_STRING { zend_do_begin_function_declaration(&$2, &$4, 1, $3.op_type, &$1 TSRMLS_CC); } '(' parameter_list ')' method_body { zend_do_abstract_method(&$4, &$1, &$9 TSRMLS_CC); zend_do_end_function_declaration(&$2 TSRMLS_CC); } @@ -632,6 +650,17 @@ | T_CONST T_STRING '=' static_scalar { zend_do_declare_class_constant(&$2, &$4 TSRMLS_CC); } ; +class_enum_declaration: + class_enum_declaration ',' { CG(enum_current_value) = 0; } '{' class_enum_inner_list '}' + | T_ENUM { CG(enum_current_value) = 0; } '{' class_enum_inner_list '}' +; + +class_enum_inner_list: + class_enum_inner_list ',' T_STRING enum_value { zend_do_declare_class_constant(&$3, &$4 TSRMLS_CC); } + | T_STRING enum_value { zend_do_declare_class_constant(&$1, &$2 TSRMLS_CC); } +; + + echo_expr_list: echo_expr_list ',' expr { zend_do_echo(&$3 TSRMLS_CC); } | expr { zend_do_echo(&$1 TSRMLS_CC); } Index: Zend/zend_globals.h =================================================================== --- Zend/zend_globals.h (révision 25) +++ Zend/zend_globals.h (révision 34) @@ -151,6 +151,7 @@ void (*interned_strings_snapshot)(TSRMLS_D); void (*interned_strings_restore)(TSRMLS_D); + long enum_current_value; #ifdef ZEND_MULTIBYTE zend_encoding **script_encoding_list; size_t script_encoding_list_size;