summaryrefslogtreecommitdiff
path: root/Zend/zend_language_parser.y
diff options
context:
space:
mode:
authorAndrei Zmievski <andrei@php.net>2003-03-31 20:42:01 +0000
committerAndrei Zmievski <andrei@php.net>2003-03-31 20:42:01 +0000
commit5657b8369119dab9c81deb036d7a43c83df332cb (patch)
tree74f0557311da249690b7b2efdc08512cdcc03d5d /Zend/zend_language_parser.y
parent383808e9d3e17d2ca2cb513d5d7d6b1dd9681c12 (diff)
downloadphp-git-5657b8369119dab9c81deb036d7a43c83df332cb.tar.gz
Multi-purpose patch:
- The fields of zend_namespace were not completely initialized which led to a variety of problems. - The occurrence of class/interface/namespace definition is now captured. - Functions/classes/interfaces/namespaces can be preceded by doc comments which are stored for use by extensions.
Diffstat (limited to 'Zend/zend_language_parser.y')
-rw-r--r--Zend/zend_language_parser.y27
1 files changed, 20 insertions, 7 deletions
diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
index b95d3a8c84..35689198b6 100644
--- a/Zend/zend_language_parser.y
+++ b/Zend/zend_language_parser.y
@@ -179,6 +179,7 @@ inner_statement:
statement:
unticked_statement { zend_do_ticks(TSRMLS_C); }
+ | doc_comment { zend_do_free(&$1 TSRMLS_CC); } unticked_statement { zend_do_ticks(TSRMLS_C); }
;
unticked_statement:
@@ -284,17 +285,27 @@ is_reference:
unticked_function_declaration_statement:
- T_FUNCTION { $1.u.opline_num = CG(zend_lineno); } is_reference T_STRING { zend_do_begin_function_declaration(&$1, &$4, 0, $3.op_type, NULL TSRMLS_CC); }
- '(' parameter_list ')' '{' inner_statement_list '}' { zend_do_end_function_declaration(&$1 TSRMLS_CC); }
+ optional_doc_comment T_FUNCTION { $2.u.opline_num = CG(zend_lineno); } is_reference T_STRING { zend_do_begin_function_declaration(&$2, &$5, 0, $4.op_type, NULL TSRMLS_CC); }
+ '(' parameter_list ')' '{' inner_statement_list '}' { zend_do_end_function_declaration(&$2, &$1 TSRMLS_CC); }
;
unticked_class_declaration_statement:
- class_entry_type T_STRING extends_from
- { zend_do_begin_class_declaration(&$1, &$2, &$3 TSRMLS_CC); }
+ optional_doc_comment class_entry_type T_STRING extends_from
+ { zend_do_begin_class_declaration(&$2, &$3, &$4 TSRMLS_CC); }
implements_list
'{'
class_statement_list
- '}' { zend_do_end_class_declaration(&$1, &$2 TSRMLS_CC); }
+ '}' { zend_do_end_class_declaration(&$2, &$4, &$1 TSRMLS_CC); }
+;
+
+optional_doc_comment:
+ /* empty */ { $$.op_type = IS_UNUSED; }
+ | doc_comment { $$ = $1; }
+;
+
+
+doc_comment:
+ T_DOC_COMMENT { $$ = $1; }
;
@@ -305,7 +316,7 @@ class_entry_type:
;
namespace_declaration_statement:
- T_NAMESPACE namespace_name '{' { zend_do_begin_namespace(&$1, &$2 TSRMLS_CC); } namespace_statement_list '}' { zend_do_end_namespace(&$1 TSRMLS_CC); }
+ optional_doc_comment T_NAMESPACE namespace_name '{' { zend_do_begin_namespace(&$2, &$3 TSRMLS_CC); } namespace_statement_list '}' { zend_do_end_namespace(&$2, &$1 TSRMLS_CC); }
;
namespace_statement_list:
@@ -503,7 +514,9 @@ class_statement:
variable_modifiers { CG(access_type) = $1.u.constant.value.lval; } class_variable_declaration ';'
| class_constant_declaration ';'
| method_modifiers T_FUNCTION { $2.u.opline_num = CG(zend_lineno); } is_reference T_STRING { zend_do_begin_function_declaration(&$2, &$5, 1, $4.op_type, &$1 TSRMLS_CC); } '('
- parameter_list ')' method_body { zend_do_abstract_method(&$5, &$1, &$10 TSRMLS_CC); zend_do_end_function_declaration(&$2 TSRMLS_CC); }
+ parameter_list ')' method_body { zend_do_abstract_method(&$5, &$1, &$10 TSRMLS_CC); zend_do_end_function_declaration(&$2, NULL TSRMLS_CC); }
+ | doc_comment method_modifiers T_FUNCTION { $3.u.opline_num = CG(zend_lineno); } is_reference T_STRING { zend_do_begin_function_declaration(&$3, &$6, 1, $5.op_type, &$2 TSRMLS_CC); } '('
+ parameter_list ')' method_body { zend_do_abstract_method(&$6, &$2, &$11 TSRMLS_CC); zend_do_end_function_declaration(&$3, &$1 TSRMLS_CC); }
;