diff options
Diffstat (limited to 'Zend/zend_language_parser.y')
-rw-r--r-- | Zend/zend_language_parser.y | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index ed800c46f8..54ec8eab25 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -162,6 +162,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*); %token <ident> T_CLASS "'class'" %token <ident> T_TRAIT "'trait'" %token <ident> T_INTERFACE "'interface'" +%token <ident> T_ENUM "'enum'" %token <ident> T_EXTENDS "'extends'" %token <ident> T_IMPLEMENTS "'implements'" %token <ident> T_NAMESPACE "'namespace'" @@ -268,6 +269,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*); %type <ast> attributed_statement attributed_class_statement attributed_parameter %type <ast> attribute_decl attribute attributes attribute_group namespace_declaration_name %type <ast> match match_arm_list non_empty_match_arm_list match_arm match_arm_cond_list +%type <ast> enum_declaration_statement enum_backing_type enum_case enum_case_expr %type <num> returns_ref function fn is_reference is_variadic variable_modifiers %type <num> method_modifiers non_empty_member_modifiers member_modifier optional_visibility_modifier @@ -291,7 +293,7 @@ reserved_non_modifiers: | T_THROW | T_USE | T_INSTEADOF | T_GLOBAL | T_VAR | T_UNSET | T_ISSET | T_EMPTY | T_CONTINUE | T_GOTO | T_FUNCTION | T_CONST | T_RETURN | T_PRINT | T_YIELD | T_LIST | T_SWITCH | T_ENDSWITCH | T_CASE | T_DEFAULT | T_BREAK | T_ARRAY | T_CALLABLE | T_EXTENDS | T_IMPLEMENTS | T_NAMESPACE | T_TRAIT | T_INTERFACE | T_CLASS - | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_FN | T_MATCH + | T_CLASS_C | T_TRAIT_C | T_FUNC_C | T_METHOD_C | T_LINE | T_FILE | T_DIR | T_NS_C | T_FN | T_MATCH | T_ENUM ; semi_reserved: @@ -366,6 +368,7 @@ attributed_statement: | class_declaration_statement { $$ = $1; } | trait_declaration_statement { $$ = $1; } | interface_declaration_statement { $$ = $1; } + | enum_declaration_statement { $$ = $1; } ; top_statement: @@ -592,6 +595,27 @@ interface_declaration_statement: { $$ = zend_ast_create_decl(ZEND_AST_CLASS, ZEND_ACC_INTERFACE, $<num>2, $5, zend_ast_get_str($3), NULL, $4, $7, NULL, NULL); } ; +enum_declaration_statement: + T_ENUM { $<num>$ = CG(zend_lineno); } + T_STRING enum_backing_type implements_list backup_doc_comment '{' class_statement_list '}' + { $$ = zend_ast_create_decl(ZEND_AST_CLASS, ZEND_ACC_ENUM|ZEND_ACC_FINAL, $<num>2, $6, zend_ast_get_str($3), NULL, $5, $8, NULL, $4); } +; + +enum_backing_type: + %empty { $$ = NULL; } + | ':' type_expr { $$ = $2; } +; + +enum_case: + T_CASE identifier enum_case_expr ';' + { $$ = zend_ast_create(ZEND_AST_ENUM_CASE, $2, $3, NULL); } +; + +enum_case_expr: + %empty { $$ = NULL; } + | '=' expr { $$ = $2; } +; + extends_from: %empty { $$ = NULL; } | T_EXTENDS class_name { $$ = $2; } @@ -859,6 +883,7 @@ attributed_class_statement: return_type backup_fn_flags method_body backup_fn_flags { $$ = zend_ast_create_decl(ZEND_AST_METHOD, $3 | $1 | $12, $2, $5, zend_ast_get_str($4), $7, NULL, $11, $9, NULL); CG(extra_fn_flags) = $10; } + | enum_case { $$ = $1; } ; class_statement: |