Hi,
sorry if I missed something but is there any reason to not use keyword "use"?
IMHO allowing keywords in class, method, function, etc. names brings
more confusion then value.
On 10/23/07, Gregory Beaver <[EMAIL PROTECTED]> wrote:
> Stanislav Malyshev wrote:
> >> Hold off for a bit - I may have a simple solution that solves the
> >> problem for class names, method names and functions, have to code the
> >> patch tonight first to prove it works.
> >
> > OK, please send it as soon as you have it :)
> Hi,
>
> The attached patch is for PHP 5.3, if it is acceptable, I will port it
> to PHP 6, which is not difficult, although it does involve a lot of
> cut/pasting.
>
> The patch does these things:
>
> 1) fixes an unrelated bug I found in implementation of LSB - "static" is
> not checked for in zend_do_import()/zend_do_namespace() and other places
> that we check for "self" and "parent"
> 2) fixes a rather serious error in the fix for Bug #42859 - missing
> parens in zend_do_import()
> 3) adds "import" and "namespace" as valid function/class names
> 4) allows any string for method names, just as we allow any string for
> variable names
> 5) fixes a bug in logic for $class->list where $class-> list (note the
> whitespace between -> and list) returns a T_LIST instead of T_STRING
> 6) It allows "import ::Classname as Blah" which is currently a parse error
> 7) class constants are unchanged - reserved words still error out.
>
> Note that the zend_compile.c fixes can all be committed directly as they
> are all bugfixes and not related to the import/namespace/reserved words fix.
>
> To implement this, I added several states to the lexer in order to
> return T_STRING whenever possible, which is after T_NEW, T_INTERFACE,
> T_CLASS, T_EXTENDS and in the T_IMPLEMENTS list. In addition, after
> T_FUNCTION outside of a class, it returns T_STRING for "import" and
> "namespace" but no other reserved words. After T_FUNCTION inside of a
> class (method declaration), it returns T_STRING for all possible
> strings. After :: or -> T_STRING is always returned. Also, rather than
> take the approach LSB does with T_STATIC, I have the lexer initialize
> the string value of T_IMPORT and T_NAMESPACE so we can preserve case for
> autoloading needs. The parser frees the unused char * when normal
> import/namespace declarations are called.
>
> In the parser, I use fully_qualified_class_name instead of
> namespace_name for both import syntaxes. This introduces a minor issue
> in that this is no longer a parse error:
>
> import static::oops as Classname;
>
> However, if "Classname" is used, this will simply result in "Fatal
> error: Class 'static::oops' not found in..." and shouldn't be too big of
> a deal. Also in the parser, I inserted T_IMPORT and T_NAMESPACE as
> aliases to T_STRING in global situations to allow for static method
> calls, class constants, and fully-qualified namespace calls.
>
> Basically this script is now possible with the patch:
>
> <?php
> namespace import;
> import ::Exception as Test;
> function import() {echo 'import function';}
> interface import {}
> interface fooey {}
> class Exception extends ::Exception implements fooey, import {}
> class namespace {
> const HI = 3;
> function list() {echo __METHOD__;}
> }
> import();
> var_dump(namespace::HI);
> namespace::list();
> ?>
>
> and results in this output:
>
> [EMAIL PROTECTED]:~/workspace/php5$ sapi/cli/php -n testme.php
> import functionint(3)
> import::namespace::list
>
> I have not performed profiling on the patch, instead focusing on
> correctness for now.
>
> The patch looks complicated because of the additional states, but is
> really not that complicated, honest.
>
> :)
> Greg
>
> ? Zend/tests/zend_function_name.phpt
> Index: Zend/zend_compile.c
> ===================================================================
> RCS file: /repository/ZendEngine2/zend_compile.c,v
> retrieving revision 1.647.2.27.2.41.2.10
> diff -u -r1.647.2.27.2.41.2.10 zend_compile.c
> --- Zend/zend_compile.c 17 Oct 2007 10:01:21 -0000 1.647.2.27.2.41.2.10
> +++ Zend/zend_compile.c 23 Oct 2007 03:15:41 -0000
> @@ -2975,7 +2975,7 @@
>
> lcname = zend_str_tolower_dup(class_name->u.constant.value.str.val,
> class_name->u.constant.value.str.len);
>
> - if (!(strcmp(lcname, "self") && strcmp(lcname, "parent"))) {
> + if (!(strcmp(lcname, "self") && strcmp(lcname, "parent") &&
> strcmp(lcname, "static"))) {
> efree(lcname);
> zend_error(E_COMPILE_ERROR, "Cannot use '%s' as class name as
> it is reserved", class_name->u.constant.value.str.val);
> }
> @@ -4582,7 +4582,9 @@
> if (((Z_STRLEN(name->u.constant) == sizeof("self")-1) &&
> !memcmp(lcname, "self", sizeof("self")-1)) ||
> ((Z_STRLEN(name->u.constant) == sizeof("parent")-1) &&
> - !memcmp(lcname, "parent", sizeof("parent")-1))) {
> + !memcmp(lcname, "parent", sizeof("parent")-1)) ||
> + ((Z_STRLEN(name->u.constant) == sizeof("static")-1) &&
> + !memcmp(lcname, "static", sizeof("static")-1))) {
> zend_error(E_COMPILE_ERROR, "Cannot use '%s' as namespace
> name", Z_STRVAL(name->u.constant));
> }
> efree(lcname);
> @@ -4596,7 +4598,7 @@
> {
> char *lcname;
> zval *name, *ns, tmp;
> - zend_bool warn = 0;
> + zend_bool warn = 0, shorthand = 0;
>
> if (!CG(current_import)) {
> CG(current_import) = emalloc(sizeof(HashTable));
> @@ -4611,11 +4613,12 @@
> char *p;
>
> /* The form "import A::B" is eqivalent to "import A::B as B".
> - So we extract the last part of compound name ti use as a
> new_name */
> + So we extract the last part of compound name to use as a
> new_name */
> name = &tmp;
> p = zend_memrchr(Z_STRVAL_P(ns), ':', Z_STRLEN_P(ns));
> if (p) {
> ZVAL_STRING(name, p+1, 1);
> + shorthand = 1;
> } else {
> *name = *ns;
> zval_copy_ctor(name);
> @@ -4627,6 +4630,8 @@
>
> if (((Z_STRLEN_P(name) == sizeof("self")-1) &&
> !memcmp(lcname, "self", sizeof("self")-1)) ||
> + ((Z_STRLEN_P(name) == sizeof("static")-1) &&
> + !memcmp(lcname, "static", sizeof("static")-1)) ||
> ((Z_STRLEN_P(name) == sizeof("parent")-1) &&
> !memcmp(lcname, "parent", sizeof("parent")-1))) {
> zend_error(E_COMPILE_ERROR, "Cannot use '%s' as import name",
> Z_STRVAL_P(name));
> @@ -4640,7 +4645,8 @@
> ns_name[Z_STRLEN_P(CG(current_namespace))] = ':';
> ns_name[Z_STRLEN_P(CG(current_namespace))+1] = ':';
> memcpy(ns_name+Z_STRLEN_P(CG(current_namespace))+2, lcname,
> Z_STRLEN_P(name)+1);
> - if (zend_hash_exists(CG(class_table), ns_name,
> Z_STRLEN_P(CG(current_namespace)) + 2 + Z_STRLEN_P(name)+1)) {
> + /* if our new import name is simply the shorthand, skip this
> check */
> + if ((!shorthand || !memcmp(ns_name, Z_STRVAL_P(ns),
> Z_STRLEN_P(ns) + 1)) && zend_hash_exists(CG(class_table), ns_name,
> Z_STRLEN_P(CG(current_namespace)) + 2 + Z_STRLEN_P(name)+1)) {
> zend_error(E_COMPILE_ERROR, "Import name '%s'
> conflicts with defined class", Z_STRVAL_P(name));
> }
> efree(ns_name);
> Index: Zend/zend_language_parser.y
> ===================================================================
> RCS file: /repository/ZendEngine2/zend_language_parser.y,v
> retrieving revision 1.160.2.4.2.8.2.4
> diff -u -r1.160.2.4.2.8.2.4 zend_language_parser.y
> --- Zend/zend_language_parser.y 1 Oct 2007 10:37:13 -0000
> 1.160.2.4.2.8.2.4
> +++ Zend/zend_language_parser.y 23 Oct 2007 03:15:41 -0000
> @@ -47,7 +47,7 @@
> %}
>
> %pure_parser
> -%expect 2
> +%expect 3
>
> %left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE
> %left ','
> @@ -142,7 +142,7 @@
> %token T_END_HEREDOC
> %token T_DOLLAR_OPEN_CURLY_BRACES
> %token T_CURLY_OPEN
> -%token T_PAAMAYIM_NEKUDOTAYIM
> +%left T_PAAMAYIM_NEKUDOTAYIM
> %token T_NAMESPACE
> %token T_IMPORT
> %token T_NS_C
> @@ -160,6 +160,8 @@
>
> namespace_name:
> T_STRING { $$ = $1; }
> + | T_IMPORT { $$ = $1; }
> + | T_NAMESPACE { $$ = $1; }
> | namespace_name T_PAAMAYIM_NEKUDOTAYIM T_STRING {
> zend_do_build_namespace_name(&$$, &$1, &$3 TSRMLS_CC); }
> ;
>
> @@ -168,9 +170,9 @@
> | function_declaration_statement {
> zend_do_early_binding(TSRMLS_C); }
> | class_declaration_statement {
> zend_do_early_binding(TSRMLS_C); }
> | T_HALT_COMPILER '(' ')' ';' {
> zend_do_halt_compiler_register(TSRMLS_C); YYACCEPT; }
> - | T_NAMESPACE namespace_name ';' { zend_do_namespace(&$2
> TSRMLS_CC); }
> - | T_IMPORT namespace_name ';' { zend_do_import(&$2,
> NULL TSRMLS_CC); }
> - | T_IMPORT namespace_name T_AS T_STRING ';' {
> zend_do_import(&$2, &$4 TSRMLS_CC); }
> + | T_NAMESPACE namespace_name ';' {
> efree($1.u.constant.value.str.val);zend_do_namespace(&$2 TSRMLS_CC); }
> + | T_IMPORT fully_qualified_class_name ';' {
> efree($1.u.constant.value.str.val);zend_do_import(&$2, NULL TSRMLS_CC); }
> + | T_IMPORT fully_qualified_class_name T_AS function_name_token
> ';' { efree($1.u.constant.value.str.val);zend_do_import(&$2, &$4
> TSRMLS_CC); }
> | constant_declaration ';'
> ;
>
> @@ -298,6 +300,12 @@
> '(' parameter_list ')' '{' inner_statement_list '}' {
> zend_do_end_function_declaration(&$1 TSRMLS_CC); }
> ;
>
> +function_name_token:
> + T_STRING { $$ = $1; }
> + | T_NAMESPACE { $$ = $1; }
> + | T_IMPORT { $$ = $1; }
> +;
> +
> unticked_class_declaration_statement:
> class_entry_type T_STRING extends_from
> { zend_do_begin_class_declaration(&$1, &$2, &$3
> TSRMLS_CC); }
> @@ -636,7 +644,7 @@
> ;
>
> function_call:
> - T_STRING '(' { $2.u.opline_num =
> zend_do_begin_function_call(&$1, 1 TSRMLS_CC); }
> + function_name_token '(' { $2.u.opline_num =
> zend_do_begin_function_call(&$1, 1 TSRMLS_CC); }
> function_call_parameter_list
> ')' { zend_do_end_function_call(&$1, &$$,
> &$4, 0, $2.u.opline_num TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); }
> | T_PAAMAYIM_NEKUDOTAYIM T_STRING '(' { $3.u.opline_num =
> zend_do_begin_function_call(&$2, 0 TSRMLS_CC); }
> @@ -661,6 +669,8 @@
>
> fully_qualified_class_name:
> T_STRING { $$ = $1; }
> + | T_IMPORT { $$ = $1; }
> + | T_NAMESPACE { $$ = $1; }
> | T_STATIC { $$.op_type = IS_CONST;
> ZVAL_STRINGL(&$$.u.constant, "static", sizeof("static")-1, 1);}
> | T_PAAMAYIM_NEKUDOTAYIM T_STRING {
> zend_do_build_namespace_name(&$$, NULL, &$2 TSRMLS_CC); }
> | fully_qualified_class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING {
> zend_do_build_namespace_name(&$$, &$1, &$3 TSRMLS_CC); }
> Index: Zend/zend_language_scanner.l
> ===================================================================
> RCS file: /repository/ZendEngine2/zend_language_scanner.l,v
> retrieving revision 1.131.2.11.2.13.2.2
> diff -u -r1.131.2.11.2.13.2.2 zend_language_scanner.l
> --- Zend/zend_language_scanner.l 7 Oct 2007 05:22:03 -0000
> 1.131.2.11.2.13.2.2
> +++ Zend/zend_language_scanner.l 23 Oct 2007 03:15:42 -0000
> @@ -45,6 +45,11 @@
> %x ST_COMMENT
> %x ST_DOC_COMMENT
> %x ST_ONE_LINE_COMMENT
> +%x ST_LOOKING_FOR_CLASSNAME
> +%x ST_LOOKING_FOR_EXTENDS
> +%x ST_LOOKING_FOR_IMPLEMENTS
> +%x ST_LOOKING_FOR_FUNCTION_NAME
> +%x ST_LOOKING_FOR_METHOD_NAME
> %option stack
>
> %{
> @@ -969,143 +974,172 @@
> %option noyywrap
> %%
>
> -<ST_IN_SCRIPTING>"exit" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"exit"
> {
> return T_EXIT;
> }
>
> -<ST_IN_SCRIPTING>"die" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"die"
> {
> return T_EXIT;
> }
>
> <ST_IN_SCRIPTING>"function" {
> + if (CG(active_class_entry)) {
> + yy_push_state(ST_LOOKING_FOR_METHOD_NAME TSRMLS_CC);
> + } else {
> + yy_push_state(ST_LOOKING_FOR_FUNCTION_NAME TSRMLS_CC);
> + }
> + return T_FUNCTION;
> +}
> +
> +<ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"function"
> {
> return T_FUNCTION;
> }
>
> -<ST_IN_SCRIPTING>"const" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"const"
> {
> return T_CONST;
> }
>
> -<ST_IN_SCRIPTING>"return" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"return"
> {
> return T_RETURN;
> }
>
> -<ST_IN_SCRIPTING>"try" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"try"
> {
> return T_TRY;
> }
>
> -<ST_IN_SCRIPTING>"catch" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"catch"
> {
> return T_CATCH;
> }
>
> -<ST_IN_SCRIPTING>"throw" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"throw"
> {
> return T_THROW;
> }
>
> -<ST_IN_SCRIPTING>"if" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"if"
> {
> return T_IF;
> }
>
> -<ST_IN_SCRIPTING>"elseif" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"elseif"
> {
> return T_ELSEIF;
> }
>
> -<ST_IN_SCRIPTING>"endif" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"endif"
> {
> return T_ENDIF;
> }
>
> -<ST_IN_SCRIPTING>"else" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"else"
> {
> return T_ELSE;
> }
>
> -<ST_IN_SCRIPTING>"while" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"while"
> {
> return T_WHILE;
> }
>
> -<ST_IN_SCRIPTING>"endwhile" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"endwhile"
> {
> return T_ENDWHILE;
> }
>
> -<ST_IN_SCRIPTING>"do" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"do"
> {
> return T_DO;
> }
>
> -<ST_IN_SCRIPTING>"for" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"for"
> {
> return T_FOR;
> }
>
> -<ST_IN_SCRIPTING>"endfor" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"endfor"
> {
> return T_ENDFOR;
> }
>
> -<ST_IN_SCRIPTING>"foreach" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"foreach"
> {
> return T_FOREACH;
> }
>
> -<ST_IN_SCRIPTING>"endforeach" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"endforeach"
> {
> return T_ENDFOREACH;
> }
>
> -<ST_IN_SCRIPTING>"declare" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"declare"
> {
> return T_DECLARE;
> }
>
> -<ST_IN_SCRIPTING>"enddeclare" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"enddeclare"
> {
> return T_ENDDECLARE;
> }
>
> -<ST_IN_SCRIPTING>"instanceof" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"instanceof"
> {
> return T_INSTANCEOF;
> }
>
> -<ST_IN_SCRIPTING>"as" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"as"
> {
> return T_AS;
> }
>
> -<ST_IN_SCRIPTING>"switch" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"switch"
> {
> return T_SWITCH;
> }
>
> -<ST_IN_SCRIPTING>"endswitch" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"endswitch"
> {
> return T_ENDSWITCH;
> }
>
> -<ST_IN_SCRIPTING>"case" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"case"
> {
> return T_CASE;
> }
>
> -<ST_IN_SCRIPTING>"default" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"default"
> {
> return T_DEFAULT;
> }
>
> -<ST_IN_SCRIPTING>"break" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"break"
> {
> return T_BREAK;
> }
>
> -<ST_IN_SCRIPTING>"continue" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"continue"
> {
> return T_CONTINUE;
> }
>
> -<ST_IN_SCRIPTING>"echo" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"echo"
> {
> return T_ECHO;
> }
>
> -<ST_IN_SCRIPTING>"print" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"print"
> {
> return T_PRINT;
> }
>
> <ST_IN_SCRIPTING>"class" {
> + yy_push_state(ST_LOOKING_FOR_CLASSNAME TSRMLS_CC);
> + return T_CLASS;
> +}
> +
> +<ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"class"
> {
> return T_CLASS;
> }
>
> <ST_IN_SCRIPTING>"interface" {
> + yy_push_state(ST_LOOKING_FOR_CLASSNAME TSRMLS_CC);
> + return T_INTERFACE;
> +}
> +
> +<ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"interface"
> {
> return T_INTERFACE;
> }
>
> <ST_IN_SCRIPTING>"extends" {
> + yy_push_state(ST_LOOKING_FOR_EXTENDS TSRMLS_CC);
> + return T_EXTENDS;
> +}
> +
> +<ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"extends"
> {
> return T_EXTENDS;
> }
>
> <ST_IN_SCRIPTING>"implements" {
> + yy_push_state(ST_LOOKING_FOR_IMPLEMENTS TSRMLS_CC);
> + return T_IMPLEMENTS;
> +}
> +
> +<ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"implements"
> {
> return T_IMPLEMENTS;
> }
>
> @@ -1118,31 +1152,47 @@
> return T_OBJECT_OPERATOR;
> }
>
> -<ST_LOOKING_FOR_PROPERTY>{LABEL} {
> +<ST_LOOKING_FOR_METHOD_NAME>'&' {
> + return '&';
> +}
> +
> +<ST_LOOKING_FOR_PROPERTY,ST_LOOKING_FOR_METHOD_NAME>{WHITESPACE} {
> + zendlval->value.str.val = yytext; /* no copying - intentional */
> + zendlval->value.str.len = yyleng;
> + zendlval->type = IS_STRING;
> + HANDLE_NEWLINES(yytext, yyleng);
> + return T_WHITESPACE;
> +}
> +
> +<ST_LOOKING_FOR_PROPERTY,ST_LOOKING_FOR_METHOD_NAME>{LABEL} {
> yy_pop_state(TSRMLS_C);
> zend_copy_value(zendlval, yytext, yyleng);
> zendlval->type = IS_STRING;
> return T_STRING;
> }
>
> -<ST_LOOKING_FOR_PROPERTY>{ANY_CHAR} {
> +<ST_LOOKING_FOR_PROPERTY,ST_LOOKING_FOR_METHOD_NAME>{ANY_CHAR} {
> yyless(0);
> yy_pop_state(TSRMLS_C);
> }
>
> <ST_IN_SCRIPTING>"::" {
> + yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
> return T_PAAMAYIM_NEKUDOTAYIM;
> }
>
> <ST_IN_SCRIPTING>"new" {
> + yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
> return T_NEW;
> }
>
> -<ST_IN_SCRIPTING>"clone" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"clone"
> {
> + zend_copy_value(zendlval, yytext, yyleng);
> + zendlval->type = IS_STRING;
> return T_CLONE;
> }
>
> -<ST_IN_SCRIPTING>"var" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"var"
> {
> return T_VAR;
> }
>
> @@ -1178,79 +1228,83 @@
> return T_UNSET_CAST;
> }
>
> -<ST_IN_SCRIPTING>"eval" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"eval"
> {
> return T_EVAL;
> }
>
> -<ST_IN_SCRIPTING>"include" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"include"
> {
> return T_INCLUDE;
> }
>
> -<ST_IN_SCRIPTING>"include_once" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"include_once"
> {
> return T_INCLUDE_ONCE;
> }
>
> -<ST_IN_SCRIPTING>"require" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"require"
> {
> return T_REQUIRE;
> }
>
> -<ST_IN_SCRIPTING>"require_once" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"require_once"
> {
> return T_REQUIRE_ONCE;
> }
>
> <ST_IN_SCRIPTING>"namespace" {
> + zend_copy_value(zendlval, yytext, yyleng);
> + zendlval->type = IS_STRING;
> return T_NAMESPACE;
> }
>
> <ST_IN_SCRIPTING>"import" {
> + zend_copy_value(zendlval, yytext, yyleng);
> + zendlval->type = IS_STRING;
> return T_IMPORT;
> }
>
> -<ST_IN_SCRIPTING>"use" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"use"
> {
> return T_USE;
> }
>
> -<ST_IN_SCRIPTING>"global" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"global"
> {
> return T_GLOBAL;
> }
>
> -<ST_IN_SCRIPTING>"isset" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"isset"
> {
> return T_ISSET;
> }
>
> -<ST_IN_SCRIPTING>"empty" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"empty"
> {
> return T_EMPTY;
> }
>
> -<ST_IN_SCRIPTING>"__halt_compiler" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"__halt_compiler"
> {
> return T_HALT_COMPILER;
> }
>
> -<ST_IN_SCRIPTING>"static" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"static"
> {
> return T_STATIC;
> }
>
> -<ST_IN_SCRIPTING>"abstract" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"abstract"
> {
> return T_ABSTRACT;
> }
>
> -<ST_IN_SCRIPTING>"final" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"final"
> {
> return T_FINAL;
> }
>
> -<ST_IN_SCRIPTING>"private" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"private"
> {
> return T_PRIVATE;
> }
>
> -<ST_IN_SCRIPTING>"protected" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"protected"
> {
> return T_PROTECTED;
> }
>
> -<ST_IN_SCRIPTING>"public" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"public"
> {
> return T_PUBLIC;
> }
>
> -<ST_IN_SCRIPTING>"unset" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"unset"
> {
> return T_UNSET;
> }
>
> @@ -1258,11 +1312,11 @@
> return T_DOUBLE_ARROW;
> }
>
> -<ST_IN_SCRIPTING>"list" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"list"
> {
> return T_LIST;
> }
>
> -<ST_IN_SCRIPTING>"array" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"array"
> {
> return T_ARRAY;
> }
>
> @@ -1480,7 +1534,7 @@
> return T_DNUMBER;
> }
>
> -<ST_IN_SCRIPTING>"__CLASS__" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"__CLASS__"
> {
> char *class_name = NULL;
>
> if (CG(active_class_entry)) {
> @@ -1496,7 +1550,7 @@
> return T_CLASS_C;
> }
>
> -<ST_IN_SCRIPTING>"__FUNCTION__" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"__FUNCTION__"
> {
> char *func_name = NULL;
>
> if (CG(active_op_array)) {
> @@ -1512,7 +1566,7 @@
> return T_FUNC_C;
> }
>
> -<ST_IN_SCRIPTING>"__METHOD__" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"__METHOD__"
> {
> char *class_name = CG(active_class_entry) ?
> CG(active_class_entry)->name : NULL;
> char *func_name = CG(active_op_array)?
> CG(active_op_array)->function_name : NULL;
> size_t len = 0;
> @@ -1533,13 +1587,13 @@
> return T_METHOD_C;
> }
>
> -<ST_IN_SCRIPTING>"__LINE__" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"__LINE__"
> {
> zendlval->value.lval = CG(zend_lineno);
> zendlval->type = IS_LONG;
> return T_LINE;
> }
>
> -<ST_IN_SCRIPTING>"__FILE__" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"__FILE__"
> {
> char *filename = zend_get_compiled_filename(TSRMLS_C);
>
> if (!filename) {
> @@ -1551,7 +1605,7 @@
> return T_FILE;
> }
>
> -<ST_IN_SCRIPTING>"__NAMESPACE__" {
> +<ST_IN_SCRIPTING,ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>"__NAMESPACE__"
> {
> if (CG(current_namespace)) {
> *zendlval = *CG(current_namespace);
> zval_copy_ctor(zendlval);
> @@ -1561,6 +1615,38 @@
> return T_NS_C;
> }
>
> +<ST_LOOKING_FOR_IMPLEMENTS>"," {
> + return ',';
> +}
> +
> +<ST_LOOKING_FOR_FUNCTION_NAME>"&" {
> + return '&';
> +}
> +
> +<ST_LOOKING_FOR_IMPLEMENTS>"::" {
> + return T_PAAMAYIM_NEKUDOTAYIM;
> +}
> +
> +<ST_LOOKING_FOR_IMPLEMENTS,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME>{WHITESPACE}
> {
> + zendlval->value.str.val = yytext; /* no copying - intentional */
> + zendlval->value.str.len = yyleng;
> + zendlval->type = IS_STRING;
> + HANDLE_NEWLINES(yytext, yyleng);
> + return T_WHITESPACE;
> +}
> +
> +<ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_FUNCTION_NAME,ST_LOOKING_FOR_IMPLEMENTS>{LABEL}
> {
> + yy_pop_state(TSRMLS_C);
> + zend_copy_value(zendlval, yytext, yyleng);
> + zendlval->type = IS_STRING;
> + return T_STRING;
> +}
> +
> +<ST_LOOKING_FOR_FUNCTION_NAME,ST_LOOKING_FOR_CLASSNAME,ST_LOOKING_FOR_EXTENDS,ST_LOOKING_FOR_IMPLEMENTS>{ANY_CHAR}
> {
> + yyless(0);
> + yy_pop_state(TSRMLS_C);
> +}
> +
> <INITIAL>(([^<]|"<"[^?%s<]){1,400})|"<s"|"<" {
> #ifdef ZEND_MULTIBYTE
> if (SCNG(output_filter)) {
> @@ -1693,7 +1779,6 @@
> return T_STRING;
> }
>
> -
> <ST_IN_SCRIPTING>{WHITESPACE} {
> zendlval->value.str.val = yytext; /* no copying - intentional */
> zendlval->value.str.len = yyleng;
>
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
--
Pagarbiai
Giedrius Dubinskas
Mob.: 8 672 42863
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php