Changeset View
Changeset View
Standalone View
Standalone View
support/xhpast/parser.y
| Show First 20 Lines • Show All 63 Lines • ▼ Show 20 Lines | static void replacestr(string &source, const string &find, const string &rep) { | ||||
| while ((j = source.find(find)) != std::string::npos) { | while ((j = source.find(find)) != std::string::npos) { | ||||
| source.replace(j, find.length(), rep); | source.replace(j, find.length(), rep); | ||||
| } | } | ||||
| } | } | ||||
| */ | */ | ||||
| %} | %} | ||||
| %expect 9 | %expect 12 | ||||
| // 2: PHP's if/else grammar | // 2: PHP's if/else grammar | ||||
| // 7: expr '[' dim_offset ']' -- shift will default to first grammar | // 7: expr '[' dim_offset ']' -- shift will default to first grammar | ||||
| %name-prefix = "xhpast" | %name-prefix = "xhpast" | ||||
| %pure-parser | %pure-parser | ||||
| %parse-param { void* yyscanner } | %parse-param { void* yyscanner } | ||||
| %parse-param { xhpast::Node** root } | %parse-param { xhpast::Node** root } | ||||
| %lex-param { void* yyscanner } | %lex-param { void* yyscanner } | ||||
| %error-verbose | %error-verbose | ||||
| ▲ Show 20 Lines • Show All 103 Lines • ▼ Show 20 Lines | |||||
| %token T_NS_C | %token T_NS_C | ||||
| %token T_DIR | %token T_DIR | ||||
| %token T_NS_SEPARATOR | %token T_NS_SEPARATOR | ||||
| %token T_INSTEADOF | %token T_INSTEADOF | ||||
| %token T_CALLABLE | %token T_CALLABLE | ||||
| %token T_TRAIT | %token T_TRAIT | ||||
| %token T_TRAIT_C | %token T_TRAIT_C | ||||
| %token T_YIELD | %token T_YIELD | ||||
| %token T_FINALLY | |||||
| %% | %% | ||||
| start: | start: | ||||
| top_statement_list { | top_statement_list { | ||||
| *root = NNEW(n_PROGRAM)->appendChild($1); | *root = NNEW(n_PROGRAM)->appendChild($1); | ||||
| } | } | ||||
| ; | ; | ||||
| ▲ Show 20 Lines • Show All 302 Lines • ▼ Show 20 Lines | |||||
| | T_INLINE_HTML { | | T_INLINE_HTML { | ||||
| NTYPE($1, n_INLINE_HTML); | NTYPE($1, n_INLINE_HTML); | ||||
| $$ = $1; | $$ = $1; | ||||
| } | } | ||||
| | expr ';' { | | expr ';' { | ||||
| $$ = NNEW(n_STATEMENT)->appendChild($1); | $$ = NNEW(n_STATEMENT)->appendChild($1); | ||||
| NMORE($$, $2); | NMORE($$, $2); | ||||
| } | } | ||||
| | yield_expr ';' { | |||||
| $$ = NNEW(n_STATEMENT)->appendChild($1); | |||||
| NMORE($$, $2); | |||||
| } | |||||
| | T_UNSET '(' unset_variables ')' ';' { | | T_UNSET '(' unset_variables ')' ';' { | ||||
| NMORE($3, $4); | NMORE($3, $4); | ||||
| NLMORE($3, $1); | NLMORE($3, $1); | ||||
| $$ = NNEW(n_STATEMENT)->appendChild($3); | $$ = NNEW(n_STATEMENT)->appendChild($3); | ||||
| NMORE($$, $5); | NMORE($$, $5); | ||||
| } | } | ||||
| | T_FOREACH '(' variable T_AS foreach_variable foreach_optional_arg ')' foreach_statement { | | T_FOREACH '(' variable T_AS foreach_variable foreach_optional_arg ')' foreach_statement { | ||||
| NTYPE($1, n_FOREACH); | NTYPE($1, n_FOREACH); | ||||
| Show All 33 Lines | | T_DECLARE '(' declare_list ')' declare_statement { | ||||
| $1->appendChild($3); | $1->appendChild($3); | ||||
| $1->appendChild($5); | $1->appendChild($5); | ||||
| $$ = NNEW(n_STATEMENT)->appendChild($1); | $$ = NNEW(n_STATEMENT)->appendChild($1); | ||||
| } | } | ||||
| | ';' /* empty statement */ { | | ';' /* empty statement */ { | ||||
| $$ = NNEW(n_STATEMENT)->appendChild(NNEW(n_EMPTY)); | $$ = NNEW(n_STATEMENT)->appendChild(NNEW(n_EMPTY)); | ||||
| NMORE($$, $1); | NMORE($$, $1); | ||||
| } | } | ||||
| | T_TRY '{' inner_statement_list '}' T_CATCH '(' fully_qualified_class_name T_VARIABLE ')' '{' inner_statement_list '}' additional_catches { | | T_TRY '{' inner_statement_list '}' T_CATCH '(' fully_qualified_class_name T_VARIABLE ')' '{' inner_statement_list '}' additional_catches finally_statement { | ||||
| NTYPE($1, n_TRY); | NTYPE($1, n_TRY); | ||||
| $1->appendChild(NEXPAND($2, $3, $4)); | $1->appendChild(NEXPAND($2, $3, $4)); | ||||
| NTYPE($5, n_CATCH); | NTYPE($5, n_CATCH); | ||||
| $5->appendChild($7); | $5->appendChild($7); | ||||
| $5->appendChild(NTYPE($8, n_VARIABLE)); | $5->appendChild(NTYPE($8, n_VARIABLE)); | ||||
| $5->appendChild(NEXPAND($10, $11, $12)); | $5->appendChild(NEXPAND($10, $11, $12)); | ||||
| $1->appendChild(NNEW(n_CATCH_LIST)->appendChild($5)->appendChildren($13)); | $1->appendChild(NNEW(n_CATCH_LIST)->appendChild($5)->appendChildren($13)); | ||||
| $1->appendChild($14); | |||||
| $$ = NNEW(n_STATEMENT)->appendChild($1); | $$ = NNEW(n_STATEMENT)->appendChild($1); | ||||
| } | } | ||||
| | T_THROW expr ';' { | | T_THROW expr ';' { | ||||
| NTYPE($1, n_THROW); | NTYPE($1, n_THROW); | ||||
| $1->appendChild($2); | $1->appendChild($2); | ||||
| $$ = NNEW(n_STATEMENT)->appendChild($1); | $$ = NNEW(n_STATEMENT)->appendChild($1); | ||||
| Show All 12 Lines | |||||
| additional_catches: | additional_catches: | ||||
| non_empty_additional_catches | non_empty_additional_catches | ||||
| | /* empty */ { | | /* empty */ { | ||||
| $$ = NNEW(n_EMPTY); | $$ = NNEW(n_EMPTY); | ||||
| } | } | ||||
| ; | ; | ||||
| finally_statement: | |||||
| /* empty */ { | |||||
| $$ = NNEW(n_EMPTY); | |||||
| } | |||||
| | T_FINALLY '{' inner_statement_list '}' { | |||||
| NTYPE($1, n_FINALLY); | |||||
| $1->appendChild($3); | |||||
| NMORE($1, $4); | |||||
| $$ = $1; | |||||
| } | |||||
| ; | |||||
| non_empty_additional_catches: | non_empty_additional_catches: | ||||
| additional_catch { | additional_catch { | ||||
| $$ = NNEW(n_CATCH_LIST); | $$ = NNEW(n_CATCH_LIST); | ||||
| $$->appendChild($1); | $$->appendChild($1); | ||||
| } | } | ||||
| | non_empty_additional_catches additional_catch { | | non_empty_additional_catches additional_catch { | ||||
| $1->appendChild($2); | $1->appendChild($2); | ||||
| $$ = $1; | $$ = $1; | ||||
| ▲ Show 20 Lines • Show All 97 Lines • ▼ Show 20 Lines | | T_ABSTRACT T_CLASS { | ||||
| } | } | ||||
| | T_FINAL T_CLASS { | | T_FINAL T_CLASS { | ||||
| NTYPE($2, n_CLASS_ATTRIBUTES); | NTYPE($2, n_CLASS_ATTRIBUTES); | ||||
| NLMORE($2, $1); | NLMORE($2, $1); | ||||
| $2->appendChild(NTYPE($1, n_STRING)); | $2->appendChild(NTYPE($1, n_STRING)); | ||||
| $$ = $2; | $$ = $2; | ||||
| } | } | ||||
| | T_TRAIT { | |||||
| $$ = NNEW(n_CLASS_ATTRIBUTES); | |||||
| $$->appendChild(NTYPE($1, n_STRING)); | |||||
| } | |||||
| ; | ; | ||||
| extends_from: | extends_from: | ||||
| /* empty */ { | /* empty */ { | ||||
| $$ = NNEW(n_EMPTY); | $$ = NNEW(n_EMPTY); | ||||
| } | } | ||||
| | T_EXTENDS fully_qualified_class_name { | | T_EXTENDS fully_qualified_class_name { | ||||
| $$ = NTYPE($1, n_EXTENDS_LIST)->appendChild($2); | $$ = NTYPE($1, n_EXTENDS_LIST)->appendChild($2); | ||||
| ▲ Show 20 Lines • Show All 293 Lines • ▼ Show 20 Lines | /* empty */ { | ||||
| $$ = NNEW(n_EMPTY); | $$ = NNEW(n_EMPTY); | ||||
| } | } | ||||
| | fully_qualified_class_name { | | fully_qualified_class_name { | ||||
| $$ = $1; | $$ = $1; | ||||
| } | } | ||||
| | T_ARRAY { | | T_ARRAY { | ||||
| $$ = NTYPE($1, n_TYPE_NAME); | $$ = NTYPE($1, n_TYPE_NAME); | ||||
| } | } | ||||
| | T_CALLABLE { | |||||
| $$ = NTYPE($1, n_TYPE_NAME); | |||||
| } | |||||
| ; | ; | ||||
| function_call_parameter_list: | function_call_parameter_list: | ||||
| non_empty_function_call_parameter_list | non_empty_function_call_parameter_list | ||||
| | /* empty */ { | | /* empty */ { | ||||
| $$ = NNEW(n_CALL_PARAMETER_LIST); | $$ = NNEW(n_CALL_PARAMETER_LIST); | ||||
| } | } | ||||
| ; | ; | ||||
| ▲ Show 20 Lines • Show All 98 Lines • ▼ Show 20 Lines | variable_modifiers class_variable_declaration ';' { | ||||
| $$ = NNEW(n_STATEMENT)->appendChild($$); | $$ = NNEW(n_STATEMENT)->appendChild($$); | ||||
| NMORE($$, $3); | NMORE($$, $3); | ||||
| } | } | ||||
| | class_constant_declaration ';' { | | class_constant_declaration ';' { | ||||
| $$ = NNEW(n_STATEMENT)->appendChild($1); | $$ = NNEW(n_STATEMENT)->appendChild($1); | ||||
| NMORE($$, $2); | NMORE($$, $2); | ||||
| } | } | ||||
| | trait_use_statement { | |||||
| $$ = $1; | |||||
| } | |||||
| | method_modifiers function { | | method_modifiers function { | ||||
| yyextra->old_expecting_xhp_class_statements = yyextra->expecting_xhp_class_statements; | yyextra->old_expecting_xhp_class_statements = yyextra->expecting_xhp_class_statements; | ||||
| yyextra->expecting_xhp_class_statements = false; | yyextra->expecting_xhp_class_statements = false; | ||||
| } is_reference T_STRING '(' parameter_list ')' method_body { | } is_reference T_STRING '(' parameter_list ')' method_body { | ||||
| yyextra->expecting_xhp_class_statements = yyextra->old_expecting_xhp_class_statements; | yyextra->expecting_xhp_class_statements = yyextra->old_expecting_xhp_class_statements; | ||||
| $$ = NNEW(n_METHOD_DECLARATION); | $$ = NNEW(n_METHOD_DECLARATION); | ||||
| $$->appendChild($1); | $$->appendChild($1); | ||||
| $$->appendChild($4); | $$->appendChild($4); | ||||
| $$->appendChild(NTYPE($5, n_STRING)); | $$->appendChild(NTYPE($5, n_STRING)); | ||||
| $$->appendChild(NEXPAND($6, $7, $8)); | $$->appendChild(NEXPAND($6, $7, $8)); | ||||
| $$->appendChild(NNEW(n_EMPTY)); | $$->appendChild(NNEW(n_EMPTY)); | ||||
| $$->appendChild($9); | $$->appendChild($9); | ||||
| $$ = NNEW(n_STATEMENT)->appendChild($$); | $$ = NNEW(n_STATEMENT)->appendChild($$); | ||||
| } | } | ||||
| ; | ; | ||||
| trait_use_statement: | |||||
| T_USE trait_list trait_adaptations { | |||||
| $$ = NTYPE($1, n_TRAIT_USE); | |||||
| $$->appendChildren($2); | |||||
| $$->appendChild($3); | |||||
| } | |||||
| ; | |||||
| trait_list: | |||||
| fully_qualified_class_name { | |||||
| $$ = NNEW(n_TRAIT_USE_LIST)->appendChild($1); | |||||
| } | |||||
| | trait_list ',' fully_qualified_class_name { | |||||
| $$ = $1->appendChild($3); | |||||
| } | |||||
| ; | |||||
| trait_adaptations: | |||||
| ';' { | |||||
| $$ = NNEW(n_EMPTY); | |||||
| } | |||||
| | '{' trait_adaptation_list '}' { | |||||
| $$ = NEXPAND($1, $2, $3); | |||||
| } | |||||
| ; | |||||
| trait_adaptation_list: | |||||
| /* empty */ { | |||||
| $$ = NNEW(n_TRAIT_ADAPTATION_LIST); | |||||
| } | |||||
| | non_empty_trait_adaptation_list { | |||||
| $$ = $1; | |||||
| } | |||||
| ; | |||||
| non_empty_trait_adaptation_list: | |||||
| trait_adaptation_statement { | |||||
| $$ = NNEW(n_TRAIT_ADAPTATION_LIST); | |||||
| $$->appendChild($1); | |||||
| } | |||||
| | non_empty_trait_adaptation_list trait_adaptation_statement { | |||||
| $1->appendChild($2); | |||||
| $$ = $1; | |||||
| } | |||||
| ; | |||||
| trait_adaptation_statement: | |||||
| trait_precedence ';' { | |||||
| $$ = NMORE($1, $2); | |||||
| } | |||||
| | trait_alias ';' { | |||||
| $$ = NMORE($1, $2); | |||||
| } | |||||
| ; | |||||
| trait_precedence: | |||||
| trait_method_reference_fully_qualified T_INSTEADOF trait_reference_list { | |||||
| $$ = NNEW(n_TRAIT_INSTEADOF); | |||||
| $$->appendChild($1); | |||||
| $$->appendChild($3); | |||||
| } | |||||
| ; | |||||
| trait_reference_list: | |||||
| fully_qualified_class_name { | |||||
| $$ = NNEW(n_TRAIT_REFERENCE_LIST); | |||||
| $$->appendChild($1); | |||||
| } | |||||
| | trait_reference_list ',' fully_qualified_class_name { | |||||
| $1->appendChild($3); | |||||
| $$ = $1; | |||||
| } | |||||
| ; | |||||
| trait_method_reference: | |||||
| T_STRING { | |||||
| $$ = NNEW(n_TRAIT_METHOD_REFERENCE); | |||||
| $$->appendChild(NTYPE($1, n_STRING)); | |||||
| } | |||||
| | trait_method_reference_fully_qualified { | |||||
| $$ = $1; | |||||
| } | |||||
| ; | |||||
| trait_method_reference_fully_qualified: | |||||
| fully_qualified_class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { | |||||
| NTYPE($2, n_TRAIT_METHOD_REFERENCE); | |||||
| NEXPAND($1, $2, NTYPE($3, n_STRING)); | |||||
| $$ = $2; | |||||
| } | |||||
| ; | |||||
| trait_alias: | |||||
| trait_method_reference T_AS trait_modifiers T_STRING { | |||||
| $$ = NNEW(n_TRAIT_AS); | |||||
| $$->appendChild($1); | |||||
| $$->appendChild($3); | |||||
| $$->appendChild(NTYPE($4, n_STRING)); | |||||
| } | |||||
| | trait_method_reference T_AS member_modifier { | |||||
| $$ = NNEW(n_TRAIT_AS); | |||||
| $$->appendChild($1); | |||||
| $$->appendChild($3); | |||||
| $$->appendChild(NNEW(n_EMPTY)); | |||||
| } | |||||
| ; | |||||
| trait_modifiers: | |||||
| /* empty */ { | |||||
| $$ = NNEW(n_EMPTY); | |||||
| } | |||||
| | member_modifier { | |||||
| $$ = NNEW(n_METHOD_MODIFIER_LIST); | |||||
| $$->appendChild(NTYPE($1, n_STRING)); | |||||
| } | |||||
| ; | |||||
| method_body: | method_body: | ||||
| ';' /* abstract method */ { | ';' /* abstract method */ { | ||||
| $$ = NNEW(n_EMPTY); | $$ = NNEW(n_EMPTY); | ||||
| } | } | ||||
| | '{' inner_statement_list '}' { | | '{' inner_statement_list '}' { | ||||
| $$ = NEXPAND($1, $2, $3); | $$ = NEXPAND($1, $2, $3); | ||||
| } | } | ||||
| ; | ; | ||||
| ▲ Show 20 Lines • Show All 505 Lines • ▼ Show 20 Lines | | '@' expr { | ||||
| $$->appendChild($2); | $$->appendChild($2); | ||||
| } | } | ||||
| | T_ARRAY '(' array_pair_list ')' { | | T_ARRAY '(' array_pair_list ')' { | ||||
| NTYPE($1, n_ARRAY_LITERAL); | NTYPE($1, n_ARRAY_LITERAL); | ||||
| $1->appendChild($3); | $1->appendChild($3); | ||||
| NMORE($1, $4); | NMORE($1, $4); | ||||
| $$ = $1; | $$ = $1; | ||||
| } | } | ||||
| | '[' array_pair_list ']' { | |||||
| NTYPE($1, n_ARRAY_LITERAL); | |||||
| $1->appendChild($2); | |||||
| NMORE($1, $3); | |||||
| $$ = $1; | |||||
| } | |||||
| | T_BACKTICKS_EXPR { | | T_BACKTICKS_EXPR { | ||||
| NTYPE($1, n_BACKTICKS_EXPRESSION); | NTYPE($1, n_BACKTICKS_EXPRESSION); | ||||
| $$ = $1; | $$ = $1; | ||||
| } | } | ||||
| | scalar | | scalar | ||||
| | T_PRINT expr { | | T_PRINT expr { | ||||
| $$ = NNEW(n_UNARY_PREFIX_EXPRESSION); | $$ = NNEW(n_UNARY_PREFIX_EXPRESSION); | ||||
| $$->appendChild(NTYPE($1, n_OPERATOR)); | $$->appendChild(NTYPE($1, n_OPERATOR)); | ||||
| $$->appendChild($2); | $$->appendChild($2); | ||||
| } | } | ||||
| | T_YIELD { | |||||
| NTYPE($1, n_YIELD); | |||||
| $1->appendChild(NNEW(n_EMPTY)); | |||||
| $1->appendChild(NNEW(n_EMPTY)); | |||||
| $$ = $1; | |||||
| } | |||||
| | '(' yield_expr ')' { | |||||
| $$ = NEXPAND($1, $2, $3); | |||||
| } | |||||
| | function is_reference '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' { | | function is_reference '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' { | ||||
| NSPAN($1, n_FUNCTION_DECLARATION, $9); | NSPAN($1, n_FUNCTION_DECLARATION, $9); | ||||
| $1->appendChild(NNEW(n_EMPTY)); | $1->appendChild(NNEW(n_EMPTY)); | ||||
| $1->appendChild($2); | $1->appendChild($2); | ||||
| $1->appendChild(NNEW(n_EMPTY)); | $1->appendChild(NNEW(n_EMPTY)); | ||||
| $1->appendChild(NEXPAND($3, $4, $5)); | $1->appendChild(NEXPAND($3, $4, $5)); | ||||
| $$->appendChild($6); | $$->appendChild($6); | ||||
| $1->appendChild(NEXPAND($7, $8, $9)); | $1->appendChild(NEXPAND($7, $8, $9)); | ||||
| Show All 14 Lines | | T_STATIC function is_reference '(' parameter_list ')' lexical_vars '{' inner_statement_list '}' { | ||||
| $2->appendChild(NEXPAND($4, $5, $6)); | $2->appendChild(NEXPAND($4, $5, $6)); | ||||
| $2->appendChild($7); | $2->appendChild($7); | ||||
| $2->appendChild(NEXPAND($8, $9, $10)); | $2->appendChild(NEXPAND($8, $9, $10)); | ||||
| $$ = $2; | $$ = $2; | ||||
| } | } | ||||
| ; | ; | ||||
| yield_expr: | |||||
| T_YIELD expr_without_variable { | |||||
| NTYPE($1, n_YIELD); | |||||
| $2->appendChild(NNEW(n_EMPTY)); | |||||
| $1->appendChild($2); | |||||
| $$ = $1; | |||||
| } | |||||
| | T_YIELD variable { | |||||
| NTYPE($1, n_YIELD); | |||||
| $2->appendChild(NNEW(n_EMPTY)); | |||||
| $1->appendChild($2); | |||||
| $$ = $1; | |||||
| } | |||||
| | T_YIELD expr T_DOUBLE_ARROW expr_without_variable { | |||||
| NTYPE($1, n_YIELD); | |||||
| $1->appendChild($2); | |||||
| $1->appendChild($4); | |||||
| $$ = $1; | |||||
| } | |||||
| | T_YIELD expr T_DOUBLE_ARROW variable { | |||||
| NTYPE($1, n_YIELD); | |||||
| $1->appendChild($2); | |||||
| $1->appendChild($4); | |||||
| $$ = $1; | |||||
| } | |||||
| ; | |||||
| function: | function: | ||||
| T_FUNCTION | T_FUNCTION | ||||
| ; | ; | ||||
| lexical_vars: | lexical_vars: | ||||
| /* empty */ { | /* empty */ { | ||||
| $$ = NNEW(n_EMPTY); | $$ = NNEW(n_EMPTY); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 190 Lines • ▼ Show 20 Lines | | T_DIR { | ||||
| $$ = NTYPE($1, n_MAGIC_SCALAR); | $$ = NTYPE($1, n_MAGIC_SCALAR); | ||||
| } | } | ||||
| | T_CLASS_C { | | T_CLASS_C { | ||||
| $$ = NTYPE($1, n_MAGIC_SCALAR); | $$ = NTYPE($1, n_MAGIC_SCALAR); | ||||
| } | } | ||||
| | T_METHOD_C { | | T_METHOD_C { | ||||
| $$ = NTYPE($1, n_MAGIC_SCALAR); | $$ = NTYPE($1, n_MAGIC_SCALAR); | ||||
| } | } | ||||
| | T_TRAIT_C { | |||||
| $$ = NTYPE($1, n_MAGIC_SCALAR); | |||||
| } | |||||
| | T_FUNC_C { | | T_FUNC_C { | ||||
| $$ = NTYPE($1, n_MAGIC_SCALAR); | $$ = NTYPE($1, n_MAGIC_SCALAR); | ||||
| } | } | ||||
| | T_NS_C { | | T_NS_C { | ||||
| $$ = NTYPE($1, n_MAGIC_SCALAR); | $$ = NTYPE($1, n_MAGIC_SCALAR); | ||||
| } | } | ||||
| | T_HEREDOC { | | T_HEREDOC { | ||||
| $$ = NTYPE($1, n_HEREDOC); | $$ = NTYPE($1, n_HEREDOC); | ||||
| Show All 22 Lines | | '-' static_scalar { | ||||
| $$->appendChild($2); | $$->appendChild($2); | ||||
| } | } | ||||
| | T_ARRAY '(' static_array_pair_list ')' { | | T_ARRAY '(' static_array_pair_list ')' { | ||||
| NTYPE($1, n_ARRAY_LITERAL); | NTYPE($1, n_ARRAY_LITERAL); | ||||
| $1->appendChild($3); | $1->appendChild($3); | ||||
| NMORE($1, $4); | NMORE($1, $4); | ||||
| $$ = $1; | $$ = $1; | ||||
| } | } | ||||
| | '[' static_array_pair_list ']' { | |||||
| NTYPE($1, n_ARRAY_LITERAL); | |||||
| $1->appendChild($2); | |||||
| NMORE($1, $3); | |||||
| $$ = $1; | |||||
| } | |||||
| | static_class_constant | | static_class_constant | ||||
| ; | ; | ||||
| static_class_constant: | static_class_constant: | ||||
| class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { | class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { | ||||
| $$ = NNEW(n_CLASS_STATIC_ACCESS); | $$ = NNEW(n_CLASS_STATIC_ACCESS); | ||||
| $$->appendChild($1); | $$->appendChild($1); | ||||
| $$->appendChild(NTYPE($3, n_STRING)); | $$->appendChild(NTYPE($3, n_STRING)); | ||||
| ▲ Show 20 Lines • Show All 456 Lines • Show Last 20 Lines | |||||