summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Pena <felipe@php.net>2010-07-08 23:22:41 +0000
committerFelipe Pena <felipe@php.net>2010-07-08 23:22:41 +0000
commit4f55f8828a2292443ed14f946cb7926e7385a77b (patch)
tree663b0718746476b624d4a9a6796947c483e80e21
parent195d5b7b23a9abac93f40bbe10c3a0864d52fe76 (diff)
downloadphp-git-4f55f8828a2292443ed14f946cb7926e7385a77b.tar.gz
- Added try_catch, isset_variables rule
-rw-r--r--Zend/zend_language_parser.y40
1 files changed, 29 insertions, 11 deletions
diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
index 007d563b04..8dcd7429a1 100644
--- a/Zend/zend_language_parser.y
+++ b/Zend/zend_language_parser.y
@@ -61,6 +61,9 @@
%type foreach2_ii {znode_array}
%type closure_i {znode_array}
%type closure_ii {znode_array}
+%type try_catch_iv {znode_array}
+%type try_catch_iii {znode_array}
+%type isset_variables_i {znode_array}
%type unticked_class_declaration_statement_i {znode_array}
%type unticked_class_declaration_statement_ii {znode_array}
@@ -203,7 +206,6 @@ use_declaration ::= NS_SEPARATOR namespace_name(B) AS STRING(C). { zend_do_use(&
constant_declaration ::= constant_declaration COMMA STRING(B) EQUAL static_scalar(C). { zend_do_declare_constant(&B, &C TSRMLS_CC); }
constant_declaration ::= CONST STRING(B) EQUAL static_scalar(C). { zend_do_declare_constant(&B, &C TSRMLS_CC); }
-//
//inner_statement_list:
// inner_statement_list { zend_do_extended_info(TSRMLS_C); } inner_statement { HANDLE_INTERACTIVE(); }
// | /* empty */
@@ -335,15 +337,23 @@ foreach2_i(A) ::= foreach2_ii(B) variable(C) foreach_optional_arg(D) RPAREN. {
foreach2 ::= foreach2_i(B) foreach_statement. { zend_do_foreach_end(&B[0], &B[1] TSRMLS_CC); }
unticked_statement ::= SEMICOLON. /* empty statement */
-/* FIXME
-try ::= TRY(B). { zend_do_try(&B TSRMLS_CC); }
-unticked_statement ::= try LBRACE inner_statement_list RBRACE.
- CATCH(B) LPAREN. { zend_initialize_try_catch_element(&B TSRMLS_CC); }
- fully_qualified_class_name. { zend_do_first_catch(&$7 TSRMLS_CC); }
- VARIABLE RPAREN { zend_do_begin_catch(&$1, &$9, &$11, &$7 TSRMLS_CC); }
- LBRACE inner_statement_list RBRACE { zend_do_end_catch(&$1 TSRMLS_CC); }
- additional_catches { zend_do_mark_last_catch(&$7, &$18 TSRMLS_CC); }
-*/
+
+// TRY { zend_do_try(&$1 TSRMLS_CC); } LBRACE inner_statement_list RBRACE
+// CATCH LPAREN { zend_initialize_try_catch_element(&$1 TSRMLS_CC); }
+// fully_qualified_class_name { zend_do_first_catch(&$7 TSRMLS_CC); }
+// VARIABLE RPAREN { zend_do_begin_catch(&$1, &$9, &$11, &$7 TSRMLS_CC); }
+// LBRACE inner_statement_list RBRACE { zend_do_end_catch(&$1 TSRMLS_CC); }
+// additional_catches { zend_do_mark_last_catch(&$7, &$18 TSRMLS_CC); }
+
+try_catch_v(A) ::= TRY(B). { zend_do_try(&B TSRMLS_CC); A = B; }
+try_catch_iv(A) ::= try_catch_v(B) LBRACE inner_statement_list RBRACE CATCH(C) LPAREN(D). { zend_initialize_try_catch_element(&B TSRMLS_CC); A[0] = B; A[1] = D; }
+try_catch_iii(A) ::= try_catch_iv(B) fully_qualified_class_name(C). { zend_do_first_catch(&B TSRMLS_CC); A[0] = B[0]; A[1] = B[1]; A[2] = C; }
+try_catch_ii(A) ::= try_catch_iii(B) VARIABLE(C) RPAREN. { zend_do_begin_catch(&B[0], &B[2], &C, &B[1] TSRMLS_CC); A = B[0]; }
+try_catch_i(A) ::= try_catch_ii(B) LBRACE inner_statement_list RBRACE. { zend_do_end_catch(&B TSRMLS_CC); A = B; }
+try_catch ::= try_catch_i(B) additional_catches(C). { zend_do_mark_last_catch(&B, &C TSRMLS_CC); }
+
+unticked_statement ::= try_catch.
+
unticked_statement ::= THROW expr(B) SEMICOLON. { zend_do_throw(&B TSRMLS_CC); }
unticked_statement ::= GOTO STRING(B) SEMICOLON. { zend_do_goto(&B TSRMLS_CC); }
@@ -1680,7 +1690,15 @@ internal_functions_in_yacc(A) ::= REQUIRE_ONCE expr(B). { zend_do_include_or_eva
// variable { zend_do_isset_or_isempty(ZEND_ISSET, &$$, &$1 TSRMLS_CC); }
// | isset_variables COMMA { zend_do_boolean_and_begin(&$1, &$2 TSRMLS_CC); } variable { znode tmp; zend_do_isset_or_isempty(ZEND_ISSET, &tmp, &$4 TSRMLS_CC); zend_do_boolean_and_end(&$$, &$1, &tmp, &$2 TSRMLS_CC); }
//;
-//
+
+isset_variables_i(A) ::= isset_variables(B) COMMA(C). { zend_do_boolean_and_begin(&B, &C TSRMLS_CC); A[0] = B; A[1] = C; }
+
+isset_variables(A) ::= variable(B). { zend_do_isset_or_isempty(ZEND_ISSET, &A, &B TSRMLS_CC); }
+isset_variables(A) ::= isset_variables_i(B) variable(C). {
+ znode tmp; zend_do_isset_or_isempty(ZEND_ISSET, &tmp, &C TSRMLS_CC);
+ zend_do_boolean_and_end(&A, &B[0], &tmp, &B[1] TSRMLS_CC);
+}
+
//class_constant:
// class_name PAAMAYIM_NEKUDOTAYIM STRING { zend_do_fetch_constant(&$$, &$1, &$3, ZEND_RT, 0 TSRMLS_CC); }
// | variable_class_name PAAMAYIM_NEKUDOTAYIM STRING { zend_do_fetch_constant(&$$, &$1, &$3, ZEND_RT, 0 TSRMLS_CC); }