From: Nikita Popov Date: Thu, 26 Jun 2014 20:04:09 +0000 (+0200) Subject: Remove obseleted grammar productions X-Git-Tag: POST_AST_MERGE^2~179 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0e44f4c583e2dbef32ff7e07f4a0c100b609d2c6;p=php Remove obseleted grammar productions --- diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index ef02d31a5f..212bd621f1 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6110,7 +6110,7 @@ void zend_compile_const_expr(zend_ast **ast_ptr TSRMLS_DC); void zend_do_constant_expression(znode *result, zend_ast *ast TSRMLS_DC) /* {{{ */ { - //zend_eval_const_expr(&ast TSRMLS_CC); + zend_eval_const_expr(&ast TSRMLS_CC); zend_compile_const_expr(&ast TSRMLS_CC); if (ast->kind == ZEND_CONST) { ZVAL_COPY_VALUE(&result->u.constant, zend_ast_get_zval(ast)); diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 945a900213..17738ef9d5 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -956,7 +956,11 @@ dereferencable_scalar: | T_CONSTANT_ENCAPSED_STRING { $$.u.ast = AST_ZVAL(&$1); } ; -common_scalar: +static_scalar: /* compile-time evaluated scalars */ + expr { zend_do_constant_expression(&$$, $1.u.ast TSRMLS_CC); } +; + +scalar: T_LNUMBER { $$.u.ast = AST_ZVAL(&$1); } | T_DNUMBER { $$.u.ast = AST_ZVAL(&$1); } | T_LINE { $$.u.ast = AST_ZVAL(&$1); } @@ -966,118 +970,22 @@ common_scalar: | T_METHOD_C { $$.u.ast = AST_ZVAL(&$1); } | T_FUNC_C { $$.u.ast = AST_ZVAL(&$1); } | T_NS_C { $$.u.ast = AST_ZVAL(&$1); } - | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC { $$.u.ast = AST_ZVAL(&$2); } - | T_START_HEREDOC T_END_HEREDOC - { zval empty_str; ZVAL_EMPTY_STRING(&empty_str); - $$.u.ast = zend_ast_create_constant(&empty_str); } -; - -static_scalar: /* compile-time evaluated scalars */ - expr { zend_do_constant_expression(&$$, $1.u.ast TSRMLS_CC); } -; - -static_scalar_value: - T_CONSTANT_ENCAPSED_STRING { $$.u.ast = AST_ZVAL(&$1); } - | class_name T_PAAMAYIM_NEKUDOTAYIM T_CLASS - { $$.u.ast = zend_ast_create_unary(ZEND_AST_RESOLVE_CLASS_NAME, AST_ZVAL(&$1)); } - | class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING - { $$.u.ast = zend_ast_create_binary( - ZEND_AST_CLASS_CONST, AST_ZVAL(&$1), AST_ZVAL(&$3)); } - | namespace_name - { $$.u.ast = zend_ast_create_unary( - ZEND_AST_CONST, zend_ast_create_zval_ex(&$1.u.constant, 1)); } - | T_NAMESPACE T_NS_SEPARATOR namespace_name - { ZVAL_EMPTY_STRING(&$1.u.constant); - zend_do_build_namespace_name(&$1, &$1, &$3 TSRMLS_CC); - $$.u.ast = zend_ast_create_unary(ZEND_AST_CONST, AST_ZVAL(&$1)); } - | T_NS_SEPARATOR namespace_name - { zval tmp; ZVAL_NEW_STR(&tmp, STR_ALLOC(Z_STRLEN($2.u.constant)+1, 0)); Z_STRVAL(tmp)[0] = '\\'; memcpy(Z_STRVAL(tmp) + 1, Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); - if (Z_DELREF($2.u.constant) == 0) { efree(Z_STR($2.u.constant)); } - Z_STR($2.u.constant) = Z_STR(tmp); - $$.u.ast = zend_ast_create_unary(ZEND_AST_CONST, AST_ZVAL(&$2)); } - | common_scalar { $$.u.ast = $1.u.ast; } - | T_ARRAY '(' static_array_pair_list ')' { $$.u.ast = $3.u.ast; } - | '[' static_array_pair_list ']' { $$.u.ast = $2.u.ast; } - | static_operation { $$.u.ast = $1.u.ast; } | T_CLASS_C { if (Z_TYPE($1.u.constant) == IS_UNDEF) { - zval class_const; - ZVAL_STRING(&class_const, "__CLASS__"); - Z_TYPE_INFO(class_const) = IS_CONSTANT_EX; - $$.u.ast = zend_ast_create_constant(&class_const); + zval class_const; ZVAL_STRING(&class_const, "__CLASS__"); + $$.u.ast = zend_ast_create_unary(ZEND_AST_CONST, + zend_ast_create_constant(&class_const)); } else { $$.u.ast = AST_ZVAL(&$1); } } -; - -static_operation: - '!' static_scalar_value { $$.u.ast = zend_ast_create_unary(ZEND_BOOL_NOT, $2.u.ast); } - | '~' static_scalar_value { $$.u.ast = zend_ast_create_unary(ZEND_BW_NOT, $2.u.ast); } - | static_scalar_value '+' static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_ADD, $1.u.ast, $3.u.ast); } - | static_scalar_value '-' static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_SUB, $1.u.ast, $3.u.ast); } - | static_scalar_value '*' static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_MUL, $1.u.ast, $3.u.ast); } - | static_scalar_value T_POW static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_POW, $1.u.ast, $3.u.ast); } - | static_scalar_value '/' static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_DIV, $1.u.ast, $3.u.ast); } - | static_scalar_value '%' static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_MOD, $1.u.ast, $3.u.ast); } - | static_scalar_value '|' static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_BW_OR, $1.u.ast, $3.u.ast); } - | static_scalar_value '&' static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_BW_AND, $1.u.ast, $3.u.ast); } - | static_scalar_value '^' static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_BW_XOR, $1.u.ast, $3.u.ast); } - | static_scalar_value T_SL static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_SL, $1.u.ast, $3.u.ast); } - | static_scalar_value T_SR static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_SR, $1.u.ast, $3.u.ast); } - | static_scalar_value '.' static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_CONCAT, $1.u.ast, $3.u.ast); } - | static_scalar_value T_LOGICAL_XOR static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_BOOL_XOR, $1.u.ast, $3.u.ast); } - | static_scalar_value T_IS_IDENTICAL static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_IS_IDENTICAL, $1.u.ast, $3.u.ast); } - | static_scalar_value T_IS_NOT_IDENTICAL static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_IS_NOT_IDENTICAL, $1.u.ast, $3.u.ast); } - | static_scalar_value T_IS_EQUAL static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_IS_EQUAL, $1.u.ast, $3.u.ast); } - | static_scalar_value T_IS_NOT_EQUAL static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_IS_NOT_EQUAL, $1.u.ast, $3.u.ast); } - | static_scalar_value '<' static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_IS_SMALLER, $1.u.ast, $3.u.ast); } - | static_scalar_value '>' static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_IS_SMALLER, $3.u.ast, $1.u.ast); } - | static_scalar_value T_IS_SMALLER_OR_EQUAL static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_IS_SMALLER_OR_EQUAL, $1.u.ast, $3.u.ast); } - | static_scalar_value T_IS_GREATER_OR_EQUAL static_scalar_value - { $$.u.ast = zend_ast_create_binary_op(ZEND_IS_SMALLER_OR_EQUAL, $3.u.ast, $1.u.ast); } - | static_scalar_value T_LOGICAL_AND static_scalar_value - { $$.u.ast = zend_ast_create_binary(ZEND_AST_AND, $1.u.ast, $3.u.ast); } - | static_scalar_value T_LOGICAL_OR static_scalar_value - { $$.u.ast = zend_ast_create_binary(ZEND_AST_OR, $1.u.ast, $3.u.ast); } - | static_scalar_value T_BOOLEAN_AND static_scalar_value - { $$.u.ast = zend_ast_create_binary(ZEND_AST_AND, $1.u.ast, $3.u.ast); } - | static_scalar_value T_BOOLEAN_OR static_scalar_value - { $$.u.ast = zend_ast_create_binary(ZEND_AST_OR, $1.u.ast, $3.u.ast); } - | static_scalar_value '?' ':' static_scalar_value - { $$.u.ast = zend_ast_create_ternary(ZEND_AST_CONDITIONAL, $1.u.ast, NULL, $4.u.ast); } - | static_scalar_value '?' static_scalar_value ':' static_scalar_value - { $$.u.ast = zend_ast_create_ternary( - ZEND_AST_CONDITIONAL, $1.u.ast, $3.u.ast, $5.u.ast); } - | '+' static_scalar_value - { $$.u.ast = zend_ast_create_unary(ZEND_AST_UNARY_PLUS, $2.u.ast); } - | '-' static_scalar_value - { $$.u.ast = zend_ast_create_unary(ZEND_AST_UNARY_MINUS, $2.u.ast); } - | '(' static_scalar_value ')' { $$.u.ast = $2.u.ast; } -; - - -scalar: - class_name_scalar { $$.u.ast = $1.u.ast; } + | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC { $$.u.ast = AST_ZVAL(&$2); } + | T_START_HEREDOC T_END_HEREDOC + { zval empty_str; ZVAL_EMPTY_STRING(&empty_str); + $$.u.ast = zend_ast_create_constant(&empty_str); } + | '"' encaps_list '"' { $$.u.ast = $2.u.ast; } + | T_START_HEREDOC encaps_list T_END_HEREDOC { $$.u.ast = $2.u.ast; } + | dereferencable_scalar { $$.u.ast = $1.u.ast; } + | class_name_scalar { $$.u.ast = $1.u.ast; } | class_constant { $$.u.ast = $1.u.ast; } | namespace_name { $$.u.ast = zend_ast_create_unary( @@ -1091,47 +999,14 @@ scalar: if (Z_DELREF($2.u.constant) == 0) { efree(Z_STR($2.u.constant)); } Z_STR($2.u.constant) = Z_STR(tmp); $$.u.ast = zend_ast_create_unary(ZEND_AST_CONST, AST_ZVAL(&$2)); } - | common_scalar { $$.u.ast = $1.u.ast; } - | '"' encaps_list '"' { $$.u.ast = $2.u.ast; } - | T_START_HEREDOC encaps_list T_END_HEREDOC { $$.u.ast = $2.u.ast; } - | T_CLASS_C - { if (Z_TYPE($1.u.constant) == IS_UNDEF) { - zval class_const; ZVAL_STRING(&class_const, "__CLASS__"); - $$.u.ast = zend_ast_create_unary(ZEND_AST_CONST, - zend_ast_create_constant(&class_const)); - } else { - $$.u.ast = AST_ZVAL(&$1); - } } - | dereferencable_scalar { $$.u.ast = $1.u.ast; } ; -static_array_pair_list: - /* empty */ - { array_init(&$$.u.constant); $$.u.ast = zend_ast_create_constant(&$$.u.constant); } - | non_empty_static_array_pair_list possible_comma - { zend_ast_dynamic_shrink(&$1.u.ast); $$ = $1; } -; - possible_comma: /* empty */ | ',' ; -non_empty_static_array_pair_list: - non_empty_static_array_pair_list ',' static_array_pair - { $$.u.ast = zend_ast_dynamic_add($1.u.ast, $3.u.ast); } - | static_array_pair - { $$.u.ast = zend_ast_create_dynamic_and_add(ZEND_AST_ARRAY, $1.u.ast); } -; - -static_array_pair: - static_scalar_value T_DOUBLE_ARROW static_scalar_value - { $$.u.ast = zend_ast_create_binary(ZEND_AST_ARRAY_ELEM, $3.u.ast, $1.u.ast); } - | static_scalar_value - { $$.u.ast = zend_ast_create_binary(ZEND_AST_ARRAY_ELEM, $1.u.ast, NULL); } -; - expr: variable { $$.u.ast = $1.u.ast; } | expr_without_variable { $$.u.ast = $1.u.ast; }