felipe Thu, 08 Jul 2010 16:28:38 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=301090
Log: - More rules translated! Changed paths: U php/php-src/branches/LEMON/Zend/zend_language_parser.y U php/php-src/branches/LEMON/Zend/zend_language_scanner.c U php/php-src/branches/LEMON/Zend/zend_language_scanner.l U php/php-src/branches/LEMON/Zend/zend_language_scanner_defs.h
Modified: php/php-src/branches/LEMON/Zend/zend_language_parser.y =================================================================== --- php/php-src/branches/LEMON/Zend/zend_language_parser.y 2010-07-08 15:56:03 UTC (rev 301089) +++ php/php-src/branches/LEMON/Zend/zend_language_parser.y 2010-07-08 16:28:38 UTC (rev 301090) @@ -70,6 +70,7 @@ | => T_BW_OR ^ => T_BW_XOR @ => T_AT + " => T_QUOTE */ @@ -408,74 +409,105 @@ // class_statement_list // RBRACE { zend_do_end_class_declaration(&$1, &$2 TSRMLS_CC); } //; -// -// + //class_entry_type: // CLASS { $$.u.op.opline_num = CG(zend_lineno); $$.EA = 0; } // | ABSTRACT CLASS { $$.u.op.opline_num = CG(zend_lineno); $$.EA = ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; } // | TRAIT { $$.u.op.opline_num = CG(zend_lineno); $$.EA = ZEND_ACC_TRAIT; } // | FINAL CLASS { $$.u.op.opline_num = CG(zend_lineno); $$.EA = ZEND_ACC_FINAL_CLASS; } //; -// + +class_entry_type(A) ::= CLASS. { A.u.op.opline_num = CG(zend_lineno); A.EA = 0; } +class_entry_type(A) ::= ABSTRACT CLASS. { A.u.op.opline_num = CG(zend_lineno); A.EA = ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; } +class_entry_type(A) ::= TRAIT. { A.u.op.opline_num = CG(zend_lineno); A.EA = ZEND_ACC_TRAIT; } +class_entry_type(A) ::= FINAL CLASS. { A.u.op.opline_num = CG(zend_lineno); A.EA = ZEND_ACC_FINAL_CLASS; } + //extends_from: // /* empty */ { $$.op_type = IS_UNUSED; } // | EXTENDS fully_qualified_class_name { zend_do_fetch_class(&$$, &$2 TSRMLS_CC); } //; -// + +extends_from(A) ::= . { A.op_type = IS_UNUSED; } +extends_from(A) ::= EXTENDS fully_qualified_class_name(B). { zend_do_fetch_class(&A, &B TSRMLS_CC); } + //interface_entry: // INTERFACE { $$.u.op.opline_num = CG(zend_lineno); $$.EA = ZEND_ACC_INTERFACE; } //; -// + +interface_entry(A) ::= INTERFACE. { A.u.op.opline_num = CG(zend_lineno); A.EA = ZEND_ACC_INTERFACE; } + //interface_extends_list: // /* empty */ // | EXTENDS interface_list //; -// + +interface_extends_list ::= . +interface_extends_list ::= EXTENDS interface_list. + //implements_list: // /* empty */ // | IMPLEMENTS interface_list //; -// + +implements_list ::= . +implements_list ::= IMPLEMENTS interface_list. + //interface_list: // fully_qualified_class_name { zend_do_implements_interface(&$1 TSRMLS_CC); } // | interface_list COMMA fully_qualified_class_name { zend_do_implements_interface(&$3 TSRMLS_CC); } //; -// + +interface_list ::= fully_qualified_class_name(B). { zend_do_implements_interface(&B TSRMLS_CC); } +interface_list ::= interface_list COMMA fully_qualified_class_name(B). { zend_do_implements_interface(&B TSRMLS_CC); } + //foreach_optional_arg: // /* empty */ { $$.op_type = IS_UNUSED; } // | DOUBLE_ARROW foreach_variable { $$ = $2; } //; -// -// + +foreach_optional_arg(A) ::= . { A.op_type = IS_UNUSED; } +foreach_optional_arg(A) ::= DOUBLE_ARROW foreach_variable(B). { A = B; } + //foreach_variable: // variable { zend_check_writable_variable(&$1); $$ = $1; } // | '&' variable { zend_check_writable_variable(&$2); $$ = $2; $$.EA |= ZEND_PARSED_REFERENCE_VARIABLE; } //; -// + +foreach_variable(A) ::= variable(B). { zend_check_writable_variable(&B); A = B; } +foreach_variable(A) ::= BW_AND variable(B). { zend_check_writable_variable(&B); A = B; A.EA |= ZEND_PARSED_REFERENCE_VARIABLE; } + //for_statement: // statement // | COLON inner_statement_list ENDFOR SEMICOLON //; -// -// + +for_statement ::= statement. +for_statement ::= COLON inner_statement_list ENDFOR SEMICOLON. + //foreach_statement: // statement // | COLON inner_statement_list ENDFOREACH SEMICOLON //; -// -// + +foreach_statement ::= statement. +foreach_statement ::= COLON inner_statement_list ENDFOREACH SEMICOLON. + //declare_statement: // statement // | COLON inner_statement_list ENDDECLARE SEMICOLON //; -// -// + +declare_statement ::= statement. +declare_statement ::= COLON inner_statement_list ENDDECLARE SEMICOLON. + //declare_list: // STRING EQUAL static_scalar { zend_do_declare_stmt(&$1, &$3 TSRMLS_CC); } // | declare_list COMMA STRING EQUAL static_scalar { zend_do_declare_stmt(&$3, &$5 TSRMLS_CC); } //; -// -// + +declare_list ::= STRING(B) EQUAL static_scalar(C). { zend_do_declare_stmt(&B, &C TSRMLS_CC); } +declare_list ::= declare_list COMMA STRING(B) EQUAL static_scalar(C). { zend_do_declare_stmt(&B, &C TSRMLS_CC); } + //switch_case_list: // LBRACE case_list RBRACE { $$ = $2; } // | LBRACE SEMICOLON case_list RBRACE { $$ = $3; } @@ -495,15 +527,18 @@ // COLON // | SEMICOLON //; -// -// + +case_separator ::= COLON. +case_separator ::= SEMICOLON. + //while_statement: // statement // | COLON inner_statement_list ENDWHILE SEMICOLON //; -// -// -// + +while_statement ::= statement. +while_statement ::= COLON inner_statement_list ENDWHILE SEMICOLON. + //elseif_list: // /* empty */ // | elseif_list ELSEIF LPAREN expr RPAREN { zend_do_if_cond(&$4, &$5 TSRMLS_CC); } statement { zend_do_if_after_statement(&$5, 0 TSRMLS_CC); } @@ -514,26 +549,31 @@ // /* empty */ // | elseif_alt_list ELSEIF LPAREN expr RPAREN COLON { zend_do_if_cond(&$4, &$5 TSRMLS_CC); } inner_statement_list { zend_do_if_after_statement(&$5, 0 TSRMLS_CC); } //; -// -// + //else_single: // /* empty */ // | ELSE statement //; -// -// + +else_single ::= . +else_single ::= ELSE statement. + //else_alt_single: // /* empty */ // | ELSE COLON inner_statement_list //; -// -// + +else_alt_single ::= . +else_alt_single ::= ELSE COLON inner_statement_list. + //parameter_list: // non_empty_parameter_list // | /* empty */ //; -// -// + +parameter_list ::= . +parameter_list ::= non_empty_parameter_list. + //non_empty_parameter_list: // optional_class_type VARIABLE { $$.op_type = IS_UNUSED; $$.u.op.num=1; zend_do_receive_arg(ZEND_RECV, &$2, &$$, NULL, &$1, 0 TSRMLS_CC); } // | optional_class_type '&' VARIABLE { $$.op_type = IS_UNUSED; $$.u.op.num=1; zend_do_receive_arg(ZEND_RECV, &$3, &$$, NULL, &$1, 1 TSRMLS_CC); } @@ -544,8 +584,16 @@ // | non_empty_parameter_list COMMA optional_class_type '&' VARIABLE EQUAL static_scalar { $$=$1; $$.u.op.num++; zend_do_receive_arg(ZEND_RECV_INIT, &$5, &$$, &$7, &$3, 1 TSRMLS_CC); } // | non_empty_parameter_list COMMA optional_class_type VARIABLE EQUAL static_scalar { $$=$1; $$.u.op.num++; zend_do_receive_arg(ZEND_RECV_INIT, &$4, &$$, &$6, &$3, 0 TSRMLS_CC); } //; -// -// + +non_empty_parameter_list(A) ::= optional_class_type(B) VARIABLE(C). { A.op_type = IS_UNUSED; A.u.op.num=1; zend_do_receive_arg(ZEND_RECV, &C, &A, NULL, &B, 0 TSRMLS_CC); } +non_empty_parameter_list(A) ::= optional_class_type(B) BW_AND VARIABLE(C). { A.op_type = IS_UNUSED; A.u.op.num=1; zend_do_receive_arg(ZEND_RECV, &C, &A, NULL, &B, 1 TSRMLS_CC); } +non_empty_parameter_list(A) ::= optional_class_type(B) BW_AND VARIABLE(C) EQUAL static_scalar(D). { A.op_type = IS_UNUSED; A.u.op.num=1; zend_do_receive_arg(ZEND_RECV_INIT, &C, &A, &D, &B, 1 TSRMLS_CC); } +non_empty_parameter_list(A) ::= optional_class_type(B) VARIABLE(C) EQUAL static_scalar(D). { A.op_type = IS_UNUSED; A.u.op.num=1; zend_do_receive_arg(ZEND_RECV_INIT, &C, &A, &D, &B, 0 TSRMLS_CC); } +non_empty_parameter_list(A) ::= non_empty_parameter_list(B) COMMA optional_class_type(C) VARIABLE(D). { A = B; A.u.op.num++; zend_do_receive_arg(ZEND_RECV, &D, &A, NULL, &C, 0 TSRMLS_CC); } +non_empty_parameter_list(A) ::= non_empty_parameter_list(B) COMMA optional_class_type(C) BW_AND VARIABLE(D). { A = B; A.u.op.num++; zend_do_receive_arg(ZEND_RECV, &D, &A, NULL, &C, 1 TSRMLS_CC); } +non_empty_parameter_list(A) ::= non_empty_parameter_list(B) COMMA optional_class_type(C) BW_AND VARIABLE(D) EQUAL static_scalar(E). { A = B; A.u.op.num++; zend_do_receive_arg(ZEND_RECV_INIT, &D, &A, &E, &C, 1 TSRMLS_CC); } +non_empty_parameter_list(A) ::= non_empty_parameter_list(B) COMMA optional_class_type(C) VARIABLE(D) EQUAL static_scalar(E). { A = B; A.u.op.num++; zend_do_receive_arg(ZEND_RECV_INIT, &D, &A, &E, &C, 0 TSRMLS_CC); } + //optional_class_type: // /* empty */ { $$.op_type = IS_UNUSED; } // | ARRAY { $$ = $1; $$.op_type = IS_CONST; Z_TYPE($$.u.constant)=IS_ARRAY; } @@ -559,14 +607,27 @@ // | NUMERIC_HINT { $$ = $1; $$.op_type = IS_CONST; Z_TYPE($$.u.constant)=IS_NUMERIC; } // | fully_qualified_class_name { $$ = $1; $$.op_type = IS_CONST; Z_TYPE($$.u.constant)=IS_CLASS; } //; -// -// + +optional_class_type(A) ::= . { A.op_type = IS_UNUSED; } +optional_class_type(A) ::= ARRAY(B). { A = B; A.op_type = IS_CONST; Z_TYPE(A.u.constant) = IS_ARRAY; } +optional_class_type(A) ::= BOOL_HINT(B). { A = B; A.op_type = IS_CONST; Z_TYPE(A.u.constant) = IS_BOOL; } +optional_class_type(A) ::= STRING_HINT(B). { A = B; A.op_type = IS_CONST; Z_TYPE(A.u.constant) = IS_STRING; } +optional_class_type(A) ::= INT_HINT(B). { A = B; A.op_type = IS_CONST; Z_TYPE(A.u.constant) = IS_LONG; } +optional_class_type(A) ::= DOUBLE_HINT(B). { A = B; A.op_type = IS_CONST; Z_TYPE(A.u.constant) = IS_DOUBLE; } +optional_class_type(A) ::= RESOURCE_HINT(B). { A = B; A.op_type = IS_CONST; Z_TYPE(A.u.constant) = IS_RESOURCE; } +optional_class_type(A) ::= OBJECT_HINT(B). { A = B; A.op_type = IS_CONST; Z_TYPE(A.u.constant) = IS_OBJECT; } +optional_class_type(A) ::= SCALAR_HINT(B). { A = B; A.op_type = IS_CONST; Z_TYPE(A.u.constant) = IS_SCALAR; } +optional_class_type(A) ::= NUMERIC_HINT(B). { A = B; A.op_type = IS_CONST; Z_TYPE(A.u.constant) = IS_NUMERIC; } +optional_class_type(A) ::= fully_qualified_class_name(B). { A = B; A.op_type = IS_CONST; Z_TYPE(A.u.constant) = IS_CLASS; } + //function_call_parameter_list: // non_empty_function_call_parameter_list { $$ = $1; } // | /* empty */ { Z_LVAL($$.u.constant) = 0; } //; -// -// + +function_call_parameter_list(A) ::= . { Z_LVAL(A.u.constant) = 0; } +function_call_parameter_list(A) ::= non_empty_function_call_parameter_list(B). { A = B; } + //non_empty_function_call_parameter_list: // expr_without_variable { Z_LVAL($$.u.constant) = 1; zend_do_pass_param(&$1, ZEND_SEND_VAL, Z_LVAL($$.u.constant) TSRMLS_CC); } // | variable { Z_LVAL($$.u.constant) = 1; zend_do_pass_param(&$1, ZEND_SEND_VAR, Z_LVAL($$.u.constant) TSRMLS_CC); } @@ -575,35 +636,52 @@ // | non_empty_function_call_parameter_list COMMA variable { Z_LVAL($$.u.constant)=Z_LVAL($1.u.constant)+1; zend_do_pass_param(&$3, ZEND_SEND_VAR, Z_LVAL($$.u.constant) TSRMLS_CC); } // | non_empty_function_call_parameter_list COMMA '&' w_variable { Z_LVAL($$.u.constant)=Z_LVAL($1.u.constant)+1; zend_do_pass_param(&$4, ZEND_SEND_REF, Z_LVAL($$.u.constant) TSRMLS_CC); } //; -// + +non_empty_function_call_parameter_list(A) ::= expr_without_variable(B). { Z_LVAL(A.u.constant) = 1; zend_do_pass_param(&B, ZEND_SEND_VAL, Z_LVAL(A.u.constant) TSRMLS_CC); } +non_empty_function_call_parameter_list(A) ::= variable(B). { Z_LVAL(A.u.constant) = 1; zend_do_pass_param(&B, ZEND_SEND_VAR, Z_LVAL(A.u.constant) TSRMLS_CC); } +non_empty_function_call_parameter_list(A) ::= BW_AND w_variable(B). { Z_LVAL(A.u.constant) = 1; zend_do_pass_param(&B, ZEND_SEND_REF, Z_LVAL(A.u.constant) TSRMLS_CC); } +non_empty_function_call_parameter_list(A) ::= non_empty_function_call_parameter_list(B) COMMA expr_without_variable(C). { Z_LVAL(A.u.constant)=Z_LVAL(B.u.constant)+1; zend_do_pass_param(&C, ZEND_SEND_VAL, Z_LVAL(A.u.constant) TSRMLS_CC); } +non_empty_function_call_parameter_list(A) ::= non_empty_function_call_parameter_list(B) COMMA variable(C). { Z_LVAL(A.u.constant)=Z_LVAL(B.u.constant)+1; zend_do_pass_param(&C, ZEND_SEND_VAR, Z_LVAL(A.u.constant) TSRMLS_CC); } +non_empty_function_call_parameter_list(A) ::= non_empty_function_call_parameter_list(B) COMMA BW_AND w_variable(C). { Z_LVAL(A.u.constant)=Z_LVAL(B.u.constant)+1; zend_do_pass_param(&C, ZEND_SEND_REF, Z_LVAL(A.u.constant) TSRMLS_CC); } + //global_var_list: // global_var_list COMMA global_var { zend_do_fetch_global_variable(&$3, NULL, ZEND_FETCH_GLOBAL_LOCK TSRMLS_CC); } // | global_var { zend_do_fetch_global_variable(&$1, NULL, ZEND_FETCH_GLOBAL_LOCK TSRMLS_CC); } //; -// -// + +global_var_list ::= global_var_list COMMA global_var(B). { zend_do_fetch_global_variable(&B, NULL, ZEND_FETCH_GLOBAL_LOCK TSRMLS_CC); } +global_var_list ::= global_var(B). { zend_do_fetch_global_variable(&B, NULL, ZEND_FETCH_GLOBAL_LOCK TSRMLS_CC); } + //global_var: // VARIABLE { $$ = $1; } // | '$' r_variable { $$ = $2; } // | '$' LBRACE expr RBRACE { $$ = $3; } //; -// -// + +global_var(A) ::= VARIABLE(B). { A = B; } +global_var(A) ::= DOLLAR r_variable(B). { A = B; } +global_var(A) ::= DOLLAR LBRACE expr(B) RBRACE. { A = B; } + //static_var_list: // static_var_list COMMA VARIABLE { zend_do_fetch_static_variable(&$3, NULL, ZEND_FETCH_STATIC TSRMLS_CC); } // | static_var_list COMMA VARIABLE EQUAL static_scalar { zend_do_fetch_static_variable(&$3, &$5, ZEND_FETCH_STATIC TSRMLS_CC); } // | VARIABLE { zend_do_fetch_static_variable(&$1, NULL, ZEND_FETCH_STATIC TSRMLS_CC); } // | VARIABLE EQUAL static_scalar { zend_do_fetch_static_variable(&$1, &$3, ZEND_FETCH_STATIC TSRMLS_CC); } -// //; -// -// + +static_var_list ::= static_var_list COMMA VARIABLE(B). { zend_do_fetch_static_variable(&B, NULL, ZEND_FETCH_STATIC TSRMLS_CC); } +static_var_list ::= static_var_list COMMA VARIABLE(B) EQUAL static_scalar(C). { zend_do_fetch_static_variable(&B, &C, ZEND_FETCH_STATIC TSRMLS_CC); } +static_var_list ::= VARIABLE(B). { zend_do_fetch_static_variable(&B, NULL, ZEND_FETCH_STATIC TSRMLS_CC); } +static_var_list ::= VARIABLE(B) EQUAL static_scalar(C). { zend_do_fetch_static_variable(&B, &C, ZEND_FETCH_STATIC TSRMLS_CC); } + //class_statement_list: // class_statement_list class_statement // | /* empty */ //; -// -// + +class_statement_list ::= . +class_statement_list ::= class_statement_list class_statement. + //class_statement: // variable_modifiers { CG(access_type) = Z_LVAL($1.u.constant); } class_variable_declaration SEMICOLON // | class_constant_declaration SEMICOLON @@ -615,80 +693,125 @@ //trait_use_statement: // USE trait_list trait_adaptations //; -// + +trait_use_statement ::= USE trait_list trait_adaptations. + //trait_list: // fully_qualified_class_name { zend_do_implements_trait(&$1 TSRMLS_CC); } // | trait_list COMMA fully_qualified_class_name { zend_do_implements_trait(&$3 TSRMLS_CC); } //; -// + +trait_list ::= fully_qualified_class_name(B). { zend_do_implements_trait(&B TSRMLS_CC); } +trait_list ::= trait_list COMMA fully_qualified_class_name(B). { zend_do_implements_trait(&B TSRMLS_CC); } + //trait_adaptations: // SEMICOLON // | LBRACE trait_adaptation_list RBRACE //; -// + +trait_adaptations ::= SEMICOLON. +trait_adaptations ::= LBRACE trait_adaptation_list RBRACE. + //trait_adaptation_list: // /* empty */ // | non_empty_trait_adaptation_list //; -// + +trait_adaptation_list ::= . +trait_adaptation_list ::= non_empty_trait_adaptation_list. + //non_empty_trait_adaptation_list: // trait_adaptation_statement // | non_empty_trait_adaptation_list trait_adaptation_statement //; -// + +non_empty_trait_adaptation_list ::= trait_adaptation_statement. +non_empty_trait_adaptation_list ::= non_empty_trait_adaptation_list trait_adaptation_statement. + //trait_adaptation_statement: // trait_precedence SEMICOLON { zend_add_trait_precedence(&$1 TSRMLS_CC); } // | trait_alias SEMICOLON { zend_add_trait_alias(&$1 TSRMLS_CC); } //; -// + +trait_adaptation_statement ::= trait_precedence(B) SEMICOLON. { zend_add_trait_precedence(&B TSRMLS_CC); } +trait_adaptation_statement ::= trait_alias(B) SEMICOLON. { zend_add_trait_alias(&B TSRMLS_CC); } + //trait_precedence: // trait_method_reference_fully_qualified INSTEADOF trait_reference_list { zend_prepare_trait_precedence(&$$, &$1, &$3 TSRMLS_CC); } //; -// + +trait_precedence(A) ::= trait_method_reference_fully_qualified(B) INSTEADOF trait_reference_list(C). { zend_prepare_trait_precedence(&A, &B, &C TSRMLS_CC); } + //trait_reference_list: // fully_qualified_class_name { zend_init_list(&$$.u.op.ptr, Z_STRVAL($1.u.constant) TSRMLS_CC); } // | trait_reference_list COMMA fully_qualified_class_name { zend_add_to_list(&$1.u.op.ptr, Z_STRVAL($3.u.constant) TSRMLS_CC); $$ = $1; } //; -// + +trait_reference_list(A) ::= fully_qualified_class_name(B). { zend_init_list(&A.u.op.ptr, Z_STRVAL(B.u.constant) TSRMLS_CC); } +trait_reference_list(A) ::= trait_reference_list(B) COMMA fully_qualified_class_name(C). { zend_add_to_list(&B.u.op.ptr, Z_STRVAL(C.u.constant) TSRMLS_CC); A = B; } + //trait_method_reference: // STRING { zend_prepare_reference(&$$, NULL, &$1 TSRMLS_CC); } // | trait_method_reference_fully_qualified { $$ = $1; } //; -// + +trait_method_reference(A) ::= STRING(B). { zend_prepare_reference(&A, NULL, &B TSRMLS_CC); } +trait_method_reference(A) ::= trait_method_reference_fully_qualified(B). { A = B; } + //trait_method_reference_fully_qualified: // fully_qualified_class_name PAAMAYIM_NEKUDOTAYIM STRING { zend_prepare_reference(&$$, &$1, &$3 TSRMLS_CC); } //; -// + +trait_method_reference_fully_qualified(A) ::= fully_qualified_class_name(B) PAAMAYIM_NEKUDOTAYIM STRING(C). { zend_prepare_reference(&A, &B, &C TSRMLS_CC); } + //trait_alias: // trait_method_reference AS trait_modifiers STRING { zend_prepare_trait_alias(&$$, &$1, &$3, &$4 TSRMLS_CC); } // | trait_method_reference AS member_modifier { zend_prepare_trait_alias(&$$, &$1, &$3, NULL TSRMLS_CC); } //; -// + +trait_alias(A) ::= trait_method_reference(B) AS trait_modifiers(C) STRING(D). { zend_prepare_trait_alias(&A, &B, &C, &D TSRMLS_CC); } +trait_alias(A) ::= trait_method_reference(B) AS member_modifier(C). { zend_prepare_trait_alias(&A, &B, &C, NULL TSRMLS_CC); } + //trait_modifiers: // /* empty */ { Z_LVAL($$.u.constant) = 0x0; } /* No change of methods visibility */ // | member_modifier { $$ = $1; } /* REM: Keep in mind, there are not only visibility modifiers */ //; -// + +trait_modifiers(A) ::= . { Z_LVAL(A.u.constant) = 0x0; } /* No change of methods visibility */ +trait_modifiers(A) ::= member_modifier(B). { A = B; } /* REM: Keep in mind, there are not only visibility modifiers */ + //method_body: // SEMICOLON /* abstract method */ { Z_LVAL($$.u.constant) = ZEND_ACC_ABSTRACT; } // | LBRACE inner_statement_list RBRACE { Z_LVAL($$.u.constant) = 0; } //; -// + +method_body(A) ::= SEMICOLON. { Z_LVAL(A.u.constant) = ZEND_ACC_ABSTRACT; } +method_body(A) ::= LBRACE inner_statement_list RBRACE. { Z_LVAL(A.u.constant) = 0; } + //variable_modifiers: // non_empty_member_modifiers { $$ = $1; } // | VAR { Z_LVAL($$.u.constant) = ZEND_ACC_PUBLIC; } //; -// + +variable_modifiers(A) ::= non_empty_member_modifiers(B). { A = B; } +variable_modifiers(A) ::= VAR. { Z_LVAL(A.u.constant) = ZEND_ACC_PUBLIC; } + //method_modifiers: // /* empty */ { Z_LVAL($$.u.constant) = ZEND_ACC_PUBLIC; } // | non_empty_member_modifiers { $$ = $1; if (!(Z_LVAL($$.u.constant) & ZEND_ACC_PPP_MASK)) { Z_LVAL($$.u.constant) |= ZEND_ACC_PUBLIC; } } //; -// + +method_modifiers(A) ::= . { Z_LVAL(A.u.constant) = ZEND_ACC_PUBLIC; } +method_modifiers(A) ::= non_empty_member_modifiers(B). { A = B; if (!(Z_LVAL(A.u.constant) & ZEND_ACC_PPP_MASK)) { Z_LVAL(A.u.constant) |= ZEND_ACC_PUBLIC; } } + //non_empty_member_modifiers: // member_modifier { $$ = $1; } // | non_empty_member_modifiers member_modifier { Z_LVAL($$.u.constant) = zend_do_verify_access_types(&$1, &$2); } //; -// + +non_empty_member_modifiers(A) ::= member_modifier(B). { A = B; } +non_empty_member_modifiers(A) ::= non_empty_member_modifiers(B) member_modifier(C). { Z_LVAL(A.u.constant) = zend_do_verify_access_types(&B, &C); } + //member_modifier: // PUBLIC { Z_LVAL($$.u.constant) = ZEND_ACC_PUBLIC; } // | PROTECTED { Z_LVAL($$.u.constant) = ZEND_ACC_PROTECTED; } @@ -697,39 +820,60 @@ // | ABSTRACT { Z_LVAL($$.u.constant) = ZEND_ACC_ABSTRACT; } // | FINAL { Z_LVAL($$.u.constant) = ZEND_ACC_FINAL; } //; -// + +member_modifier(A) ::= PUBLIC. { Z_LVAL(A.u.constant) = ZEND_ACC_PUBLIC; } +member_modifier(A) ::= PROTECTED. { Z_LVAL(A.u.constant) = ZEND_ACC_PROTECTED; } +member_modifier(A) ::= PRIVATE. { Z_LVAL(A.u.constant) = ZEND_ACC_PRIVATE; } +member_modifier(A) ::= STATIC. { Z_LVAL(A.u.constant) = ZEND_ACC_STATIC; } +member_modifier(A) ::= ABSTRACT. { Z_LVAL(A.u.constant) = ZEND_ACC_ABSTRACT; } +member_modifier(A) ::= FINAL. { Z_LVAL(A.u.constant) = ZEND_ACC_FINAL; } + //class_variable_declaration: // class_variable_declaration COMMA VARIABLE { zend_do_declare_property(&$3, NULL, CG(access_type) TSRMLS_CC); } // | class_variable_declaration COMMA VARIABLE EQUAL static_scalar { zend_do_declare_property(&$3, &$5, CG(access_type) TSRMLS_CC); } // | VARIABLE { zend_do_declare_property(&$1, NULL, CG(access_type) TSRMLS_CC); } // | VARIABLE EQUAL static_scalar { zend_do_declare_property(&$1, &$3, CG(access_type) TSRMLS_CC); } //; -// + +class_variable_declaration ::= class_variable_declaration COMMA VARIABLE(B). { zend_do_declare_property(&B, NULL, CG(access_type) TSRMLS_CC); } +class_variable_declaration ::= class_variable_declaration COMMA VARIABLE(B) EQUAL static_scalar(C). { zend_do_declare_property(&B, &C, CG(access_type) TSRMLS_CC); } +class_variable_declaration ::= VARIABLE(B). { zend_do_declare_property(&B, NULL, CG(access_type) TSRMLS_CC); } +class_variable_declaration ::= VARIABLE(B) EQUAL static_scalar(C). { zend_do_declare_property(&B, &C, CG(access_type) TSRMLS_CC); } + //class_constant_declaration: // class_constant_declaration COMMA STRING EQUAL static_scalar { zend_do_declare_class_constant(&$3, &$5 TSRMLS_CC); } // | CONST STRING EQUAL static_scalar { zend_do_declare_class_constant(&$2, &$4 TSRMLS_CC); } //; -// + +class_constant_declaration ::= class_constant_declaration COMMA STRING(B) EQUAL static_scalar(C). { zend_do_declare_class_constant(&B, &C TSRMLS_CC); } +class_constant_declaration ::= CONST STRING(B) EQUAL static_scalar(C). { zend_do_declare_class_constant(&B, &C TSRMLS_CC); } + //echo_expr_list: // echo_expr_list COMMA expr { zend_do_echo(&$3 TSRMLS_CC); } // | expr { zend_do_echo(&$1 TSRMLS_CC); } //; -// echo_expr_list ::= expr(A). { zend_do_echo(&A TSRMLS_CC); } echo_expr_list ::= echo_expr_list COMMA expr(A). { zend_do_echo(&A TSRMLS_CC); } -// //for_expr: // /* empty */ { $$.op_type = IS_CONST; Z_TYPE($$.u.constant) = IS_BOOL; Z_LVAL($$.u.constant) = 1; } // | non_empty_for_expr { $$ = $1; } //; -// + +for_expr(A) ::= . { A.op_type = IS_CONST; Z_TYPE(A.u.constant) = IS_BOOL; Z_LVAL(A.u.constant) = 1; } +for_expr(A) ::= non_empty_for_expr(B). { A = B; } + //non_empty_for_expr: // non_empty_for_expr COMMA { zend_do_free(&$1 TSRMLS_CC); } expr { $$ = $4; } // | expr { $$ = $1; } //; -// + +non_empty_for_expr_i ::= non_empty_for_expr(B) COMMA. { zend_do_free(&B TSRMLS_CC); } + +non_empty_for_expr(A) ::= non_empty_for_expr_i expr(B). { A = B; } +non_empty_for_expr(A) ::= expr(B). { A = B; } + //expr_without_variable: // LIST LPAREN { zend_do_list_init(TSRMLS_C); } assignment_list RPAREN EQUAL expr { zend_do_list_end(&$$, &$7 TSRMLS_CC); } // | variable EQUAL expr { zend_check_writable_variable(&$1); zend_do_assign(&$$, &$1, &$3 TSRMLS_CC); } @@ -856,19 +1000,29 @@ //function: // FUNCTION { $$.u.op.opline_num = CG(zend_lineno); } //; -// + +function(A) ::= FUNCTION. { A.u.op.opline_num = CG(zend_lineno); } + //lexical_vars: // /* empty */ // | USE LPAREN lexical_var_list RPAREN //; -// + +lexical_vars ::= . +lexical_vars ::= USE LPAREN lexical_var_list RPAREN. + //lexical_var_list: // lexical_var_list COMMA VARIABLE { zend_do_fetch_lexical_variable(&$3, 0 TSRMLS_CC); } // | lexical_var_list COMMA '&' VARIABLE { zend_do_fetch_lexical_variable(&$4, 1 TSRMLS_CC); } // | VARIABLE { zend_do_fetch_lexical_variable(&$1, 0 TSRMLS_CC); } // | '&' VARIABLE { zend_do_fetch_lexical_variable(&$2, 1 TSRMLS_CC); } //; -// + +lexical_var_list ::= lexical_var_list COMMA VARIABLE(B). { zend_do_fetch_lexical_variable(&B, 0 TSRMLS_CC); } +lexical_var_list ::= lexical_var_list COMMA BW_AND VARIABLE(B). { zend_do_fetch_lexical_variable(&B, 1 TSRMLS_CC); } +lexical_var_list ::= VARIABLE(B). { zend_do_fetch_lexical_variable(&B, 0 TSRMLS_CC); } +lexical_var_list ::= BW_AND VARIABLE(B). { zend_do_fetch_lexical_variable(&B, 1 TSRMLS_CC); } + //function_call: // namespace_name LPAREN { $2.u.op.opline_num = zend_do_begin_function_call(&$1, 1 TSRMLS_CC); } // function_call_parameter_list @@ -972,9 +1126,10 @@ // /* empty */ { Z_LVAL($$.u.constant)=0; } // | LPAREN function_call_parameter_list RPAREN { $$ = $2; } //; -// -// +ctor_arguments(A) ::= . { Z_LVAL(A.u.constant) = 0; } +ctor_arguments(A) ::= LPAREN function_call_parameter_list(B) RPAREN. { A = B; } + common_scalar(A) ::= LNUMBER(B). { A = B; } common_scalar(A) ::= DNUMBER(B). { A = B; } common_scalar(A) ::= CONSTANT_ENCAPSED_STRING(B). { A = B; } @@ -1024,15 +1179,25 @@ // | '"' encaps_list '"' { $$ = $2; } // | START_HEREDOC encaps_list END_HEREDOC { $$ = $2; CG(heredoc) = Z_STRVAL($1.u.constant); CG(heredoc_len) = Z_STRLEN($1.u.constant); } //; -// +scalar(A) ::= STRING_VARNAME(B). { A = B; } +scalar(A) ::= class_constant(B). { A = B; } +scalar(A) ::= namespace_name(B). { zend_do_fetch_constant(&A, NULL, &B, ZEND_RT, 1 TSRMLS_CC); } +scalar(A) ::= NAMESPACE NS_SEPARATOR namespace_name(B). { A.op_type = IS_CONST; ZVAL_EMPTY_STRING(&A.u.constant); zend_do_build_namespace_name(&A, &A, &B TSRMLS_CC); B = A; zend_do_fetch_constant(&A, NULL, &B, ZEND_RT, 0 TSRMLS_CC); } +scalar(A) ::= NS_SEPARATOR namespace_name(B). { char *tmp = estrndup(Z_STRVAL(B.u.constant), Z_STRLEN(B.u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL(B.u.constant), Z_STRLEN(B.u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL(B.u.constant)); Z_STRVAL(B.u.constant) = tmp; ++Z_STRLEN(B.u.constant); zend_do_fetch_constant(&A, NULL, &B, ZEND_RT, 0 TSRMLS_CC); } scalar(A) ::= common_scalar(B). { A = B; } -// +scalar(A) ::= QUOTE encaps_list(B) QUOTE. { A = B; } +scalar(A) ::= START_HEREDOC(B) encaps_list(C) END_HEREDOC. { A = C; CG(heredoc) = Z_STRVAL(B.u.constant); CG(heredoc_len) = Z_STRLEN(B.u.constant); } + + //static_array_pair_list: // /* empty */ { $$.op_type = IS_CONST; INIT_PZVAL(&$$.u.constant); array_init(&$$.u.constant); } // | non_empty_static_array_pair_list possible_comma { $$ = $1; } //; -// + +static_array_pair_list(A) ::= . { A.op_type = IS_CONST; INIT_PZVAL(&A.u.constant); array_init(&A.u.constant); } +static_array_pair_list(A) ::= non_empty_static_array_pair_list(B) possible_comma. { A = B; } + //possible_comma: // /* empty */ // | COMMA @@ -1048,30 +1213,30 @@ // | static_scalar DOUBLE_ARROW static_scalar { $$.op_type = IS_CONST; INIT_PZVAL(&$$.u.constant); array_init(&$$.u.constant); zend_do_add_static_array_element(&$$, &$1, &$3); } // | static_scalar { $$.op_type = IS_CONST; INIT_PZVAL(&$$.u.constant); array_init(&$$.u.constant); zend_do_add_static_array_element(&$$, NULL, &$1); } //; -// + +non_empty_static_array_pair_list(A) ::= non_empty_static_array_pair_list COMMA static_scalar(B) DOUBLE_ARROW static_scalar(C). { zend_do_add_static_array_element(&A, &B, &C); } +non_empty_static_array_pair_list(A) ::= non_empty_static_array_pair_list COMMA static_scalar(B). { zend_do_add_static_array_element(&A, NULL, &B); } +non_empty_static_array_pair_list(A) ::= static_scalar(B) DOUBLE_ARROW static_scalar(C). { A.op_type = IS_CONST; INIT_PZVAL(&A.u.constant); array_init(&A.u.constant); zend_do_add_static_array_element(&A, &B, &C); } +non_empty_static_array_pair_list(A) ::= static_scalar(B). { A.op_type = IS_CONST; INIT_PZVAL(&A.u.constant); array_init(&A.u.constant); zend_do_add_static_array_element(&A, NULL, &B); } + //expr: // r_variable { $$ = $1; } // | expr_without_variable { $$ = $1; } //; -// expr(A) ::= r_variable(B). { A = B; } expr(A) ::= expr_without_variable(B). { A = B; } -// //r_variable: // variable { zend_do_end_variable_parse(&$1, BP_VAR_R, 0 TSRMLS_CC); $$ = $1; } //; -// r_variable(A) ::= variable(B). { zend_do_end_variable_parse(&B, BP_VAR_R, 0 TSRMLS_CC); A = B; } -// //w_variable: // variable { zend_do_end_variable_parse(&$1, BP_VAR_W, 0 TSRMLS_CC); $$ = $1; // zend_check_writable_variable(&$1); } //; -// w_variable(A) ::= variable(B). { zend_do_end_variable_parse(&B, BP_VAR_W, 0 TSRMLS_CC); A = B; zend_check_writable_variable(&B); } @@ -1088,7 +1253,6 @@ // { zend_do_pop_object(&$$ TSRMLS_CC); $$.EA = $1.EA | ($7.EA ? $7.EA : $6.EA); } // | base_variable_with_function_calls { $$ = $1; } //; -// variable(A) ::= base_variable_with_function_calls(B). { A = B; } @@ -1096,17 +1260,26 @@ // variable_properties variable_property { $$.EA = $2.EA; } // | /* empty */ { $$.EA = 0; } //; -// -// + +variable_properties(A) ::= . { A.EA = 0; } +variable_properties(A) ::= variable_properties variable_property(B). { A.EA = B.EA; } + //variable_property: // OBJECT_OPERATOR object_property { zend_do_push_object(&$2 TSRMLS_CC); } method_or_not { $$.EA = $4.EA; } //; -// + +variable_property_i ::= OBJECT_OPERATOR object_property(B). { zend_do_push_object(&B TSRMLS_CC); } + +variable_property(A) ::= variable_property_i method_or_not(B). { A.EA = B.EA; } + //array_method_dereference: // array_method_dereference '[' dim_offset ']' { fetch_array_dim(&$$, &$1, &$3 TSRMLS_CC); } // | method '[' dim_offset ']' { fetch_array_dim(&$$, &$1, &$3 TSRMLS_CC); } //; -// + +array_method_dereference(A) ::= array_method_dereference(B) LBRACKET dim_offset(C) RBRACKET. { fetch_array_dim(&A, &B, &C TSRMLS_CC); } +array_method_dereference(A) ::= method(B) LBRACKET dim_offset(C) RBRACKET. { fetch_array_dim(&A, &B, &C TSRMLS_CC); } + //method: // LPAREN { zend_do_pop_object(&$1 TSRMLS_CC); zend_do_begin_method_call(&$1 TSRMLS_CC); } // function_call_parameter_list RPAREN @@ -1118,7 +1291,11 @@ // | array_method_dereference { $$ = $1; zend_do_push_object(&$$ TSRMLS_CC); } // | /* empty */ { $$.EA = ZEND_PARSED_MEMBER; } //; -// + +method_or_not(A) ::= . { A.EA = ZEND_PARSED_MEMBER; } +method_or_not(A) ::= method(B). { A = B; zend_do_push_object(&A TSRMLS_CC); A.EA = ZEND_PARSED_METHOD_CALL; } +method_or_not(A) ::= array_method_dereference(B). { A = B; zend_do_push_object(&A TSRMLS_CC); } + //variable_without_objects: // reference_variable { $$ = $1; } // | simple_indirect_reference reference_variable { zend_do_indirect_references(&$$, &$1, &$2 TSRMLS_CC); } @@ -1146,25 +1323,27 @@ // | function_call { zend_do_begin_variable_parse(TSRMLS_C); $$.EA = ZEND_PARSED_FUNCTION_CALL; } // '[' dim_offset ']' { fetch_array_dim(&$$, &$1, &$4 TSRMLS_CC); } //; -// + +array_function_dereference_i(A) ::= function_call(B). { zend_do_begin_variable_parse(TSRMLS_C); A = B; A.EA = ZEND_PARSED_FUNCTION_CALL; } + +array_function_dereference(A) ::= array_function_dereference(B) LBRACKET dim_offset(C) RBRACKET. { fetch_array_dim(&A, &B, &C TSRMLS_CC); } +array_function_dereference(A) ::= array_function_dereference_i(B) LBRACKET dim_offset(C) RBRACKET. { fetch_array_dim(&A, &B, &C TSRMLS_CC); } + //base_variable_with_function_calls: // base_variable { $$ = $1; } // | array_function_dereference { $$ = $1; } // | function_call { zend_do_begin_variable_parse(TSRMLS_C); $$ = $1; $$.EA = ZEND_PARSED_FUNCTION_CALL; } //; -// base_variable_with_function_calls(A) ::= base_variable(B). { A = B; } -//base_variable_with_function_calls(A) ::= array_function_dereference(B). { A = B; } -//base_variable_with_function_calls(A) ::= function_call(B). { zend_do_begin_variable_parse(TSRMLS_C); A = B; A.EA = ZEND_PARSED_FUNCTION_CALL; } +base_variable_with_function_calls(A) ::= array_function_dereference(B). { A = B; } +base_variable_with_function_calls(A) ::= function_call(B). { zend_do_begin_variable_parse(TSRMLS_C); A = B; A.EA = ZEND_PARSED_FUNCTION_CALL; } -// //base_variable: // reference_variable { $$ = $1; $$.EA = ZEND_PARSED_VARIABLE; } // | simple_indirect_reference reference_variable { zend_do_indirect_references(&$$, &$1, &$2 TSRMLS_CC); $$.EA = ZEND_PARSED_VARIABLE; } // | static_member { $$ = $1; $$.EA = ZEND_PARSED_STATIC_MEMBER; } //; -// base_variable(A) ::= reference_variable(B). { A = B; A.EA = ZEND_PARSED_VARIABLE; } base_variable(A) ::= simple_indirect_reference(B) reference_variable(C). { zend_do_indirect_references(&A, &B, &C TSRMLS_CC); A.EA = ZEND_PARSED_VARIABLE; } @@ -1312,6 +1491,9 @@ // | variable_class_name PAAMAYIM_NEKUDOTAYIM STRING { zend_do_fetch_constant(&$$, &$1, &$3, ZEND_RT, 0 TSRMLS_CC); } //; +class_constant(A) ::= class_name(B) PAAMAYIM_NEKUDOTAYIM STRING(C). { zend_do_fetch_constant(&A, &B, &C, ZEND_RT, 0 TSRMLS_CC); } +class_constant(A) ::= variable_class_name(B) PAAMAYIM_NEKUDOTAYIM STRING(C). { zend_do_fetch_constant(&A, &B, &C, ZEND_RT, 0 TSRMLS_CC); } + // Just to the build works todo ::= OPEN_TAG OPEN_TAG_WITH_ECHO ENCAPSED_AND_WHITESPACE CURLY_OPEN VARIABLE DOLLAR_OPEN_CURLY_BRACES END_HEREDOC WHITESPACE COMMENT CLOSE_TAG DOC_COMMENT Modified: php/php-src/branches/LEMON/Zend/zend_language_scanner.c =================================================================== --- php/php-src/branches/LEMON/Zend/zend_language_scanner.c 2010-07-08 15:56:03 UTC (rev 301089) +++ php/php-src/branches/LEMON/Zend/zend_language_scanner.c 2010-07-08 16:28:38 UTC (rev 301090) @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Thu Jul 8 10:31:08 2010 */ +/* Generated by re2c 0.13.5 on Thu Jul 8 13:15:03 2010 */ #line 1 "Zend/zend_language_scanner.l" /* +----------------------------------------------------------------------+ @@ -3189,7 +3189,7 @@ ++YYCURSOR; YYDEBUG(206, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2339 "Zend/zend_language_scanner.l" +#line 2343 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -8582,7 +8582,7 @@ ++YYCURSOR; YYDEBUG(941, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2339 "Zend/zend_language_scanner.l" +#line 2343 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -8685,6 +8685,6 @@ goto yy953; } } -#line 2348 "Zend/zend_language_scanner.l" +#line 2352 "Zend/zend_language_scanner.l" } Modified: php/php-src/branches/LEMON/Zend/zend_language_scanner.l =================================================================== --- php/php-src/branches/LEMON/Zend/zend_language_scanner.l 2010-07-08 15:56:03 UTC (rev 301089) +++ php/php-src/branches/LEMON/Zend/zend_language_scanner.l 2010-07-08 16:28:38 UTC (rev 301090) @@ -2336,6 +2336,10 @@ return T_DOLLAR; } +<ST_IN_SCRIPTING>'"' { + return T_QUOTE; +} + <ST_IN_SCRIPTING,ST_VAR_OFFSET>{ANY_CHAR} { if (YYCURSOR > YYLIMIT) { return 0; Modified: php/php-src/branches/LEMON/Zend/zend_language_scanner_defs.h =================================================================== --- php/php-src/branches/LEMON/Zend/zend_language_scanner_defs.h 2010-07-08 15:56:03 UTC (rev 301089) +++ php/php-src/branches/LEMON/Zend/zend_language_scanner_defs.h 2010-07-08 16:28:38 UTC (rev 301090) @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Thu Jul 8 10:31:08 2010 */ +/* Generated by re2c 0.13.5 on Thu Jul 8 13:15:03 2010 */ #line 3 "Zend/zend_language_scanner_defs.h" enum YYCONDTYPE {
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php