1 %name PHP_Parser_Core
2 %declare_class {class PHP_Parser_Core}
3 
4 %syntax_error {
5 /* ?><?php */
6     echo "Syntax Error on line " . $this->lex->line . ": token '" .
7         $this->lex->value . "' while parsing rule:";
8     foreach ($this->yystack as $entry) {
9         echo $this->tokenName($entry->major) . ' ';
10     }
11     foreach ($this->yy_get_expected_tokens($yymajor) as $token) {
12         $expect[] = self::$yyTokenName[$token];
13     }
14     if (count($expect) > 5) {
15         $expect = array_slice($expect, 0, 5);
16         $expect[] = '...';
17     }
18     throw new Exception('Unexpected ' . $this->tokenName($yymajor) . '(' . $TOKEN
19         . '), expected one of: ' . implode(',', $expect));
20 }
21 %include_class {
22     static public $transTable = array();
23     public $lex;
24     public $functions = array();
25     public $classes = array();
26     public $interfaces = array();
27     public $includes = array();
28     public $globals = array();
29 
30 
__construct($lex)31     function __construct($lex)
32     {
33         $this->lex = $lex;
34         if (!count(self::$transTable)) {
35             $start = 240; // start nice and low to be sure
36             while (token_name($start) == 'UNKNOWN') {
37                 $start++;
38             }
39             $hash = array_flip(self::$yyTokenName);
40             $map =
41                 array(
42                     ord(',') => self::COMMA,
43                     ord('=') => self::EQUALS,
44                     ord('?') => self::QUESTION,
45                     ord(':') => self::COLON,
46                     ord('|') => self::BAR,
47                     ord('^') => self::CARAT,
48                     ord('&') => self::AMPERSAND,
49                     ord('<') => self::LESSTHAN,
50                     ord('>') => self::GREATERTHAN,
51                     ord('+') => self::PLUS,
52                     ord('-') => self::MINUS,
53                     ord('.') => self::DOT,
54                     ord('*') => self::TIMES,
55                     ord('/') => self::DIVIDE,
56                     ord('%') => self::PERCENT,
57                     ord('!') => self::EXCLAM,
58                     ord('~') => self::TILDE,
59                     ord('@') => self::AT,
60                     ord('[') => self::LBRACKET,
61                     ord('(') => self::LPAREN,
62                     ord(')') => self::RPAREN,
63                     ord(';') => self::SEMI,
64                     ord('{') => self::LCURLY,
65                     ord('}') => self::RCURLY,
66                     ord('`') => self::BACKQUOTE,
67                     ord('$') => self::DOLLAR,
68                     ord(']') => self::RBRACKET,
69                     ord('"') => self::DOUBLEQUOTE,
70                     ord("'") => self::SINGLEQUOTE,
71                 );
72             for ($i = $start; $i < self::YYERRORSYMBOL + $start; $i++) {
73                 $lt = token_name($i);
74                 $lt = ($lt == 'T_DOUBLE_COLON') ?  'T_PAAMAYIM_NEKUDOTAYIM' : $lt;
75 //                echo "$lt has hash? ".$hash[$lt]."\n";
76                 if (!isset($hash[$lt])) {
77                     continue;
78                 }
79 
80                 //echo "compare $lt with {$tokens[$i]}\n";
81                 $map[$i] = $hash[$lt];
82             }
83             //print_r($map);
84             // set the map to false if nothing in there.
85             self::$transTable = $map;
86         }
87     }
88 
89     public $data;
90 }
91 
92 %left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE.
93 %left COMMA.
94 %left T_LOGICAL_OR.
95 %left T_LOGICAL_XOR.
96 %left T_LOGICAL_AND.
97 %right T_PRINT.
98 %left EQUALS T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL.
99 %left QUESTION COLON.
100 %left T_BOOLEAN_OR.
101 %left T_BOOLEAN_AND.
102 %left BAR.
103 %left CARAT.
104 %left AMPERSAND.
105 %nonassoc T_IS_EQUAL T_IS_NOT_EQUAL T_IS_IDENTICAL T_IS_NOT_IDENTICAL.
106 %nonassoc LESSTHAN T_IS_SMALLER_OR_EQUAL GREATERTHAN T_IS_GREATER_OR_EQUAL.
107 %left T_SL T_SR.
108 %left PLUS MINUS DOT.
109 %left TIMES DIVIDE PERCENT.
110 %right EXCLAM.
111 %nonassoc T_INSTANCEOF.
112 %right TILDE T_INC T_DEC T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_UNICODE_CAST T_BINARY_CAST T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST AT.
113 %right LBRACKET.
114 %nonassoc T_NEW T_CLONE.
115 %left T_ELSEIF.
116 %left T_ELSE.
117 %left T_ENDIF.
118 %right T_STATIC T_ABSTRACT T_FINAL T_PRIVATE T_PROTECTED T_PUBLIC.
119 
120 %parse_accept {
121 }
122 
top_statement_list(B)123 start ::= top_statement_list(B). {$this->data = B->metadata;}
124 
top_statement_list(A)125 top_statement_list(A) ::= top_statement_list(B) top_statement(C). {
126     A = B;
127     A[] = C;
128 }
top_statement_list(A)129 top_statement_list(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
130 
top_statement(A)131 top_statement(A) ::= statement(B). {A = B;}
top_statement(A)132 top_statement(A) ::= function_declaration_statement(B). {A = B;}
top_statement(A)133 top_statement(A) ::= class_declaration_statement(B). {A = B;}
134 top_statement ::= T_HALT_COMPILER LPAREN RPAREN SEMI. { $this->lex->haltParsing(); }
135 
statement(A)136 statement(A) ::= unticked_statement(B). {A = B;}
137 
unticked_statement(A)138 unticked_statement(A) ::= LCURLY inner_statement_list(B) RCURLY. {A = B;}
unticked_statement(A)139 unticked_statement(A) ::= T_IF LPAREN expr(E) RPAREN statement(I) elseif_list(EL) else_single(ELL). {
140     A = new PHP_Parser_CoreyyToken('');
141     A[] = E;
142     A[] = I;
143     A[] = EL;
144     A[] = ELL;
145 }
unticked_statement(A)146 unticked_statement(A) ::= T_IF LPAREN expr(E) RPAREN COLON inner_statement_list(I) new_elseif_list(EL) new_else_single(ELL) T_ENDIF SEMI. {
147     A = new PHP_Parser_CoreyyToken('if (' . E->string . '):' . I->string . EL->string . ELL->string . 'endif;');
148     A[] = E;
149     A[] = I;
150     A[] = EL;
151     A[] = ELL;
152 }
unticked_statement(A)153 unticked_statement(A) ::= T_WHILE LPAREN expr(B) RPAREN while_statement(C). {
154     A = new PHP_Parser_CoreyyToken('');
155     A[] = B;
156     A[] = C;
157 }
unticked_statement(A)158 unticked_statement(A) ::= T_DO statement(B) T_WHILE LPAREN expr(C) RPAREN SEMI. {
159     A = new PHP_Parser_CoreyyToken('');
160     A[] = B;
161     A[] = C;
162 }
unticked_statement(A)163 unticked_statement(A) ::= T_FOR
164             LPAREN
165                 for_expr(B)
166             SEMI
167                 for_expr(C)
168             SEMI
169                 for_expr(D)
170             RPAREN
171             for_statement(E). {
172     A = new PHP_Parser_CoreyyToken('');
173     A[] = B;
174     A[] = C;
175     A[] = D;
176     A[] = E;
177 }
unticked_statement(A)178 unticked_statement(A) ::= T_SWITCH LPAREN expr(B) RPAREN switch_case_list(C). {
179     A = new PHP_Parser_CoreyyToken('');
180     A[] = B;
181     A[] = C;
182 }
183 unticked_statement ::= T_BREAK SEMI.
unticked_statement(A)184 unticked_statement(A) ::= T_BREAK expr(B) SEMI. {
185     A = new PHP_Parser_CoreyyToken('');
186     A[] = B;
187 }
188 unticked_statement ::= T_CONTINUE SEMI.
unticked_statement(A)189 unticked_statement(A) ::= T_CONTINUE expr(B) SEMI. {
190     A = new PHP_Parser_CoreyyToken('', B);
191 }
192 unticked_statement ::= T_RETURN SEMI.
unticked_statement(A)193 unticked_statement(A) ::= T_RETURN expr_without_variable(B) SEMI. {
194     A = new PHP_Parser_CoreyyToken('return ' . B->string . ';', B);
195 }
unticked_statement(A)196 unticked_statement(A) ::= T_RETURN variable(B) SEMI. {
197     A = new PHP_Parser_CoreyyToken('return ' . B->string . ';', B);
198 }
unticked_statement(A)199 unticked_statement(A) ::= T_GLOBAL global_var_list(B) SEMI. {A = B;}
unticked_statement(A)200 unticked_statement(A) ::= T_STATIC static_var_list(B) SEMI. {A = B;}
unticked_statement(A)201 unticked_statement(A) ::= T_ECHO echo_expr_list(B) SEMI. {
202     A = new PHP_Parser_CoreyyToken('', B);
203 }
204 unticked_statement ::= T_INLINE_HTML.
unticked_statement(A)205 unticked_statement(A) ::= expr(B) SEMI. {A = B;}
unticked_statement(A)206 unticked_statement(A) ::= T_USE use_filename(B) SEMI. {
207     A = new PHP_Parser_CoreyyToken('', array('uses' => trim(B)));
208     // not that "uses" would actually work in real life
209 }
unticked_statement(A)210 unticked_statement(A) ::= T_UNSET LPAREN unset_variables(B) RPAREN SEMI. {
211     A = new PHP_Parser_CoreyyToken('', B);
212 }
unticked_statement(A)213 unticked_statement(A) ::= T_FOREACH LPAREN variable(B) T_AS
214         foreach_variable foreach_optional_arg RPAREN
215         foreach_statement(C). {
216     A = new PHP_Parser_CoreyyToken('', B);
217     A[] = C;
218 }
unticked_statement(A)219 unticked_statement(A) ::= T_FOREACH LPAREN expr_without_variable(B) T_AS
220         variable foreach_optional_arg RPAREN
221         foreach_statement(C). {
222     A = new PHP_Parser_CoreyyToken('', B);
223     A[] = C;
224 }
unticked_statement(A)225 unticked_statement(A) ::= T_DECLARE LPAREN declare_list(B) RPAREN declare_statement(C). {
226     A = new PHP_Parser_CoreyyToken('', B);
227     A[] = C;
228 }
229 unticked_statement ::= SEMI.
unticked_statement(A)230 unticked_statement(A) ::= T_TRY LCURLY inner_statement_list(B) RCURLY
231         T_CATCH LPAREN
232         fully_qualified_class_name(C)
233         T_VARIABLE RPAREN
234         LCURLY inner_statement_list(D) RCURLY
235         additional_catches(E). {
236     A = new PHP_Parser_CoreyyToken('');
237     A[] = array('catches' => C);
238     A[] = B;
239     A[] = D;
240     A[] = E;
241 }
unticked_statement(A)242 unticked_statement(A) ::= T_THROW expr(B) SEMI. {
243     if (B->metadata && isset(B->metadata[0]) && isset(B->metadata[0]['uses']) &&
244           B->metadata[0]['uses'] === 'class') {
245         A = new PHP_Parser_CoreyyToken('throw ' . B->string, array('throws' => B->metadata[0]['name']));
246     } else {
247         A = new PHP_Parser_CoreyyToken('throw ' . B->string);
248         A[] = B;
249     }
250 }
251 
additional_catches(A)252 additional_catches(A) ::= non_empty_additional_catches(B). {A = B;}
253 additional_catches ::= .
254 
non_empty_additional_catches(A)255 non_empty_additional_catches(A) ::= additional_catch(B). {A = B;}
non_empty_additional_catches(A)256 non_empty_additional_catches(A) ::= non_empty_additional_catches(B) additional_catch(C). {
257     A = B;
258     A[] = C;
259 }
260 
additional_catch(A)261 additional_catch(A) ::= T_CATCH LPAREN fully_qualified_class_name(B) T_VARIABLE RPAREN LCURLY inner_statement_list(C) RCURLY. {
262     A = new PHP_Parser_CoreyyToken('', C);
263     A[] = array('catches' => B);
264 }
265 
inner_statement_list(A)266 inner_statement_list(A) ::= inner_statement_list(B) inner_statement(C). {
267     A = B;
268     A[] = C;
269 }
inner_statement_list(A)270 inner_statement_list(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
271 
inner_statement(A)272 inner_statement(A) ::= statement(B). {
273     A = B;
274 }
inner_statement(A)275 inner_statement(A) ::= function_declaration_statement(B). {
276     A = B;
277 }
inner_statement(A)278 inner_statement(A) ::= class_declaration_statement(B). {
279     A = B;
280 }
281 inner_statement ::= T_HALT_COMPILER LPAREN RPAREN SEMI. {
282     throw new Exception("Error on line " . $this->lex->line .
283         ": __halt_compiler(); can only be used at the top level");
284 }
285 
function_declaration_statement(A)286 function_declaration_statement(A) ::= unticked_function_declaration_statement(B). {
287     A = B;
288 }
289 
class_declaration_statement(A)290 class_declaration_statement(A) ::= unticked_class_declaration_statement(B). {
291     A = B;
292 }
293 
get_func_line(A)294 get_func_line(A) ::= T_FUNCTION. {A = $this->lex->line;}
unticked_function_declaration_statement(A)295 unticked_function_declaration_statement(A) ::=
296         get_func_line(LINE) is_reference(ref) T_STRING(funcname) LPAREN parameter_list(params) RPAREN
297         LCURLY inner_statement_list(funcinfo) RCURLY. {
298     A = new PHP_Parser_CoreyyToken('function ' . (ref ? '&' : '') .
299        funcname . '(' . params->string . ')');
300     list($doc, $parsed, $line) = $this->lex->getLastComment();
301     A[] = array(
302         'type' => 'function',
303         'startline' => LINE,
304         'endline' => $this->lex->line,
305         'returnsref' => ref,
306         'name' => funcname,
307         'parameters' => params->metadata,
308         'info' => funcinfo->metadata,
309         'doc' => $doc,
310         'parseddoc' => $parsed,
311         'docline' => $line,
312     );
313     $this->functions[funcname][] = array(
314         'type' => 'function',
315         'startline' => LINE,
316         'endline' => $this->lex->line,
317         'returnsref' => ref,
318         'name' => funcname,
319         'parameters' => params->metadata,
320         'info' => funcinfo->metadata,
321         'doc' => $doc,
322         'parseddoc' => $parsed,
323         'docline' => $line,
324     );
325 }
326 
unticked_class_declaration_statement(A)327 unticked_class_declaration_statement(A) ::=
328         class_entry_type(classtype) T_STRING(C) extends_from(ext)
329             implements_list(impl)
330             LCURLY
331                 class_statement_list(cinfo)
332             RCURLY. {
333     list($doc, $parsed, $line) = $this->lex->getLastComment();
334     A = new PHP_Parser_CoreyyToken('', array(
335        'type' => classtype['type'],
336        'startline' => classtype['line'],
337        'endline' => $this->lex->line,
338        'modifiers' => classtype['modifiers'],
339        'name' => C,
340        'extends' => ext->metadata,
341        'implements' => impl->metadata,
342        'info' => cinfo->metadata,
343        'doc' => $doc,
344        'parseddoc' => $parsed,
345        'docline' => $line,
346     ));
347     $this->classes[C][] = array(
348        'type' => classtype['type'],
349        'startline' => classtype['line'],
350        'endline' => $this->lex->line,
351        'modifiers' => classtype['modifiers'],
352        'name' => C,
353        'extends' => ext->metadata,
354        'implements' => impl->metadata,
355        'info' => cinfo->metadata,
356        'doc' => $doc,
357        'parseddoc' => $parsed,
358        'docline' => $line,
359     );
360 }
unticked_class_declaration_statement(A)361 unticked_class_declaration_statement(A) ::=
362         interface_entry(LINE) T_STRING(B)
363             interface_extends_list(C)
364             LCURLY
365                 class_statement_list(D)
366             RCURLY. {
367     list($doc, $parsed, $line) = $this->lex->getLastComment();
368     A = new PHP_Parser_CoreyyToken('', array(
369        'type' => 'interface',
370        'startline' => LINE,
371        'endline' => $this->lex->line,
372        'name' => B,
373        'extends' => C->metadata,
374        'info' => D->metadata,
375        'doc' => $doc,
376        'parseddoc' => $parsed,
377        'docline' => $line,
378     ));
379     $this->interfaces[B][] = array(
380        'type' => 'interface',
381        'startline' => LINE,
382        'endline' => $this->lex->line,
383        'name' => B,
384        'extends' => C->metadata,
385        'info' => D->metadata,
386        'doc' => $doc,
387        'parseddoc' => $parsed,
388        'docline' => $line,
389     );
390 }
391 
class_entry_type(A)392 class_entry_type(A) ::= T_CLASS. { A = new PHP_Parser_CoreyyToken('', array('type' => 'class', 'modifiers' => array(), 'line' => $this->lex->line)); }
class_entry_type(A)393 class_entry_type(A) ::= T_ABSTRACT T_CLASS. {
394     A = new PHP_Parser_CoreyyToken('', array('type' => 'class', 'modifiers' => array('abstract'), 'line' => $this->lex->line));
395 }
class_entry_type(A)396 class_entry_type(A) ::= T_FINAL T_CLASS. {
397     A = new PHP_Parser_CoreyyToken('', array('type' => 'class', 'modifiers' => array('final'), 'line' => $this->lex->line));
398 }
399 
extends_from(A)400 extends_from(A) ::= T_EXTENDS fully_qualified_class_name(B). {A = new PHP_Parser_CoreyyToken(B, array(B));}
extends_from(A)401 extends_from(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
402 
interface_entry(A)403 interface_entry(A) ::= T_INTERFACE. {A = $this->lex->line;}
404 
interface_extends_list(A)405 interface_extends_list(A) ::= T_EXTENDS interface_list(B). {A = B;}
interface_extends_list(A)406 interface_extends_list(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
407 
implements_list(A)408 implements_list(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
implements_list(A)409 implements_list(A) ::= T_IMPLEMENTS interface_list(B). {A = B;}
410 
interface_list(A)411 interface_list(A) ::= fully_qualified_class_name(B). {A = new PHP_Parser_CoreyyToken('', array(B));}
interface_list(A)412 interface_list(A) ::= interface_list(list) COMMA fully_qualified_class_name(B). {
413     A = list;
414     A[] = array(B);
415 }
416 
expr(A)417 expr(A) ::= r_variable(B). {A = B;}
expr(A)418 expr(A) ::= expr_without_variable(B). {A = B;}
419 
expr_without_variable(A)420 expr_without_variable(A) ::= T_LIST LPAREN assignment_list(B) RPAREN EQUALS expr(C). {
421     A = new PHP_Parser_CoreyyToken('list(' . B->string . ') = ' . C->string, B);
422     A[] = C;
423 }
expr_without_variable(A)424 expr_without_variable(A) ::= variable(VAR) EQUALS expr(E). {
425     if ($this->lex->globalSearch(VAR->string)) {
426         list($doc, $parsed, $line) = $this->lex->getLastComment();
427         A = new PHP_Parser_CoreyyToken(VAR->string . ' = ' . E->string,
428             array(
429                 'type' => 'global',
430                 'name' => VAR->string,
431                 'line' => $this->lex->line,
432                 'default' => E->string,
433                 'doc' => $doc,
434                 'parseddoc' => $parsed,
435                 'docline' => $line,
436             ));
437         A[] = VAR;
438         A[] = E;
439         $this->globals[VAR->string][] = array(
440                 'type' => 'global',
441                 'name' => VAR->string,
442                 'line' => $this->lex->line,
443                 'default' => E->string,
444                 'doc' => $doc,
445                 'parseddoc' => $parsed,
446                 'docline' => $line,
447             );
448     } else {
449         A = new PHP_Parser_CoreyyToken(VAR->string . ' = ' . E->string, VAR);
450         A[] = E;
451     }
452 }
expr_without_variable(A)453 expr_without_variable(A) ::= variable(VAR) EQUALS AMPERSAND variable(E).{
454     if ($this->lex->globalSearch(VAR->string)) {
455         list($doc, $parsed, $line) = $this->lex->getLastComment();
456         A = new PHP_Parser_CoreyyToken(VAR->string . ' = ' . E->string,
457             array(
458                 'type' => 'global',
459                 'name' => VAR->string,
460                 'line' => $this->lex->line,
461                 'default' => '&' . E->string,
462                 'doc' => $doc,
463                 'parseddoc' => $parsed,
464                 'docline' => $line,
465             ));
466         A[] = VAR;
467         A[] = E;
468         $this->globals[VAR->string][] =
469             array(
470                 'type' => 'global',
471                 'name' => VAR->string,
472                 'line' => $this->lex->line,
473                 'default' => '&' . E->string,
474                 'doc' => $doc,
475                 'parseddoc' => $parsed,
476                 'docline' => $line,
477             );
478     } else {
479         A = new PHP_Parser_CoreyyToken(VAR->string . ' = &' . E->string, VAR);
480         A[] = E;
481     }
482 }
483 
expr_without_variable(A)484 expr_without_variable(A) ::= variable(VAR) EQUALS AMPERSAND T_NEW class_name_reference(CL) ctor_arguments(ARGS). {
485     $c = is_string(CL) ? CL : CL->string;
486     if ($this->lex->globalSearch(VAR->string)) {
487         list($doc, $parsed, $line) = $this->lex->getLastComment();
488         A = new PHP_Parser_CoreyyToken(VAR->string . ' = &new ' . $c . ARGS->string,
489             array(
490                 'type' => 'global',
491                 'name' => VAR->string,
492                 'line' => $this->lex->line,
493                 'default' => '&new ' . CL->string . ARGS->string,
494                 'doc' => $doc,
495                 'parseddoc' => $parsed,
496                 'docline' => $line,
497             ));
498         A[] = VAR;
499         $this->globals[VAR->string][] =
500             array(
501                 'type' => 'global',
502                 'name' => VAR->string,
503                 'line' => $this->lex->line,
504                 'default' => '&new ' . CL->string . ARGS->string,
505                 'doc' => $doc,
506                 'parseddoc' => $parsed,
507                 'docline' => $line,
508             );
509     } else {
510         A = new PHP_Parser_CoreyyToken(VAR->string . ' = &new ' . $c . ARGS->string, VAR);
511     }
512     if (is_string(CL)) {
513         A[] = array('uses' => 'class', 'name' => trim(CL));
514     }
515     A[] = ARGS;
516 }
expr_without_variable(A)517 expr_without_variable(A) ::= T_NEW class_name_reference(B) ctor_arguments(C). {
518     $b = is_string(B) ? B : B->string;
519     A = new PHP_Parser_CoreyyToken('new ' . $b . C->string, B);
520     A[] = C;
521     if (is_string(B)) {
522         A[] = array('uses' => 'class', 'name' => trim(B));
523     }
524 }
expr_without_variable(A)525 expr_without_variable(A) ::= T_CLONE expr(B). {
526     A = new PHP_Parser_CoreyyToken('clone ' . B->string, B);
527 }
expr_without_variable(A)528 expr_without_variable(A) ::= variable(B) T_PLUS_EQUAL expr(C). {
529     A = new PHP_Parser_CoreyyToken(B->string . ' += ' . C->string, B);
530     A[] = C;
531 }
expr_without_variable(A)532 expr_without_variable(A) ::= variable(B) T_MINUS_EQUAL expr(C). {
533     A = new PHP_Parser_CoreyyToken(B->string . ' -= ' . C->string, B);
534     A[] = C;
535 }
536 
expr_without_variable(A)537 expr_without_variable(A) ::= variable(B) T_MUL_EQUAL expr(C). {
538     A = new PHP_Parser_CoreyyToken(B->string . ' *= ' . C->string, B);
539     A[] = C;
540 }
541 
expr_without_variable(A)542 expr_without_variable(A) ::= variable(B) T_DIV_EQUAL expr(C). {
543     A = new PHP_Parser_CoreyyToken(B->string . ' /= ' . C->string, B);
544     A[] = C;
545 }
546 
expr_without_variable(A)547 expr_without_variable(A) ::= variable(B) T_CONCAT_EQUAL expr(C). {
548     A = new PHP_Parser_CoreyyToken(B->string . ' .= ' . C->string, B);
549     A[] = C;
550 }
551 
expr_without_variable(A)552 expr_without_variable(A) ::= variable(B) T_MOD_EQUAL expr(C). {
553     A = new PHP_Parser_CoreyyToken(B->string . ' %= ' . C->string, B);
554     A[] = C;
555 }
556 
expr_without_variable(A)557 expr_without_variable(A) ::= variable(B) T_AND_EQUAL expr(C). {
558     A = new PHP_Parser_CoreyyToken(B->string . ' &= ' . C->string, B);
559     A[] = C;
560 }
561 
expr_without_variable(A)562 expr_without_variable(A) ::= variable(B) T_OR_EQUAL expr(C). {
563     A = new PHP_Parser_CoreyyToken(B->string . ' |= ' . C->string, B);
564     A[] = C;
565 }
566 
expr_without_variable(A)567 expr_without_variable(A) ::= variable(B) T_XOR_EQUAL expr(C). {
568     A = new PHP_Parser_CoreyyToken(B->string . ' ^= ' . C->string, B);
569     A[] = C;
570 }
571 
expr_without_variable(A)572 expr_without_variable(A) ::= variable(B) T_SL_EQUAL expr(C). {
573     A = new PHP_Parser_CoreyyToken(B->string . ' <<= ' . C->string, B);
574     A[] = C;
575 }
576 
expr_without_variable(A)577 expr_without_variable(A) ::= variable(B) T_SR_EQUAL expr(C). {
578     A = new PHP_Parser_CoreyyToken(B->string . ' >>= ' . C->string, B);
579     A[] = C;
580 }
581 
expr_without_variable(A)582 expr_without_variable(A) ::= rw_variable(B) T_INC. {
583     A = new PHP_Parser_CoreyyToken(B->string . '++', B);
584 }
expr_without_variable(A)585 expr_without_variable(A) ::= T_INC rw_variable(B). {
586     A = new PHP_Parser_CoreyyToken('++' . B->string, B);
587 }
expr_without_variable(A)588 expr_without_variable(A) ::= rw_variable(B) T_DEC. {
589     A = new PHP_Parser_CoreyyToken(B->string . '--', B);
590 }
expr_without_variable(A)591 expr_without_variable(A) ::= T_DEC rw_variable(B). {
592     A = new PHP_Parser_CoreyyToken('--' . B->string, B);
593 }
expr_without_variable(A)594 expr_without_variable(A) ::= expr(B) T_BOOLEAN_OR expr(C). {
595     A = new PHP_Parser_CoreyyToken(B->string . ' || ' . C->string, B);
596     A[] = C;
597 }
expr_without_variable(A)598 expr_without_variable(A) ::= expr(B) T_BOOLEAN_AND expr(C). {
599     A = new PHP_Parser_CoreyyToken(B->string . ' && ' . C->string, B);
600     A[] = C;
601 }
expr_without_variable(A)602 expr_without_variable(A) ::= expr(B) T_LOGICAL_OR expr(C). {
603     A = new PHP_Parser_CoreyyToken(B->string . ' OR ' . C->string, B);
604     A[] = C;
605 }
expr_without_variable(A)606 expr_without_variable(A) ::= expr(B) T_LOGICAL_AND expr(C). {
607     A = new PHP_Parser_CoreyyToken(B->string . ' AND ' . C->string, B);
608     A[] = C;
609 }
expr_without_variable(A)610 expr_without_variable(A) ::= expr(B) T_LOGICAL_XOR expr(C). {
611     A = new PHP_Parser_CoreyyToken(B->string . ' XOR ' . C->string, B);
612     A[] = C;
613 }
expr_without_variable(A)614 expr_without_variable(A) ::= expr(B) BAR expr(C). {
615     A = new PHP_Parser_CoreyyToken(B->string . ' | ' . C->string, B);
616     A[] = C;
617 }
expr_without_variable(A)618 expr_without_variable(A) ::= expr(B) AMPERSAND expr(C). {
619     A = new PHP_Parser_CoreyyToken(B->string . ' & ' . C->string, B);
620     A[] = C;
621 }
expr_without_variable(A)622 expr_without_variable(A) ::= expr(B) CARAT expr(C). {
623     A = new PHP_Parser_CoreyyToken(B->string . ' ^ ' . C->string, B);
624     A[] = C;
625 }
expr_without_variable(A)626 expr_without_variable(A) ::= expr(B) DOT expr(C). {
627     A = new PHP_Parser_CoreyyToken(B->string . ' . ' . C->string, B);
628     A[] = C;
629 }
expr_without_variable(A)630 expr_without_variable(A) ::= expr(B) PLUS expr(C). {
631     A = new PHP_Parser_CoreyyToken(B->string . ' + ' . C->string, B);
632     A[] = C;
633 }
expr_without_variable(A)634 expr_without_variable(A) ::= expr(B) MINUS expr(C). {
635     A = new PHP_Parser_CoreyyToken(B->string . ' - ' . C->string, B);
636     A[] = C;
637 }
expr_without_variable(A)638 expr_without_variable(A) ::= expr(B) TIMES expr(C). {
639     A = new PHP_Parser_CoreyyToken(B->string . ' * ' . C->string, B);
640     A[] = C;
641 }
expr_without_variable(A)642 expr_without_variable(A) ::= expr(B) DIVIDE expr(C). {
643     A = new PHP_Parser_CoreyyToken(B->string . ' / ' . C->string, B);
644     A[] = C;
645 }
expr_without_variable(A)646 expr_without_variable(A) ::= expr(B) PERCENT expr(C). {
647     A = new PHP_Parser_CoreyyToken(B->string . ' % ' . C->string, B);
648     A[] = C;
649 }
expr_without_variable(A)650 expr_without_variable(A) ::= expr(B) T_SL expr(C). {
651     A = new PHP_Parser_CoreyyToken(B->string . ' << ' . C->string, B);
652     A[] = C;
653 }
expr_without_variable(A)654 expr_without_variable(A) ::= expr(B) T_SR expr(C). {
655     A = new PHP_Parser_CoreyyToken(B->string . ' >> ' . C->string, B);
656     A[] = C;
657 }
expr_without_variable(A)658 expr_without_variable(A) ::= PLUS expr(B). {
659     A = new PHP_Parser_CoreyyToken('+' . B->string, B);
660 }
expr_without_variable(A)661 expr_without_variable(A) ::= MINUS expr(B). {
662     A = new PHP_Parser_CoreyyToken('-' . B->string, B);
663 }
expr_without_variable(A)664 expr_without_variable(A) ::= EXCLAM expr(B). {
665     A = new PHP_Parser_CoreyyToken('!' . B->string, B);
666 }
expr_without_variable(A)667 expr_without_variable(A) ::= TILDE expr(B). {
668     A = new PHP_Parser_CoreyyToken('~' . B->string, B);
669 }
expr_without_variable(A)670 expr_without_variable(A) ::= expr(B) T_IS_IDENTICAL expr(C). {
671     A = new PHP_Parser_CoreyyToken(B->string . ' === ' . C->string, B);
672     A[] = C;
673 }
expr_without_variable(A)674 expr_without_variable(A) ::= expr(B) T_IS_NOT_IDENTICAL expr(C). {
675     A = new PHP_Parser_CoreyyToken(B->string . ' !== ' . C->string, B);
676     A[] = C;
677 }
expr_without_variable(A)678 expr_without_variable(A) ::= expr(B) T_IS_EQUAL expr(C). {
679     A = new PHP_Parser_CoreyyToken(B->string . ' == ' . C->string, B);
680     A[] = C;
681 }
expr_without_variable(A)682 expr_without_variable(A) ::= expr(B) T_IS_NOT_EQUAL expr(C). {
683     A = new PHP_Parser_CoreyyToken(B->string . ' != ' . C->string, B);
684     A[] = C;
685 }
expr_without_variable(A)686 expr_without_variable(A) ::= expr(B) LESSTHAN expr(C). {
687     A = new PHP_Parser_CoreyyToken(B->string . ' < ' . C->string, B);
688     A[] = C;
689 }
expr_without_variable(A)690 expr_without_variable(A) ::= expr(B) T_IS_SMALLER_OR_EQUAL expr(C). {
691     A = new PHP_Parser_CoreyyToken(B->string . ' <= ' . C->string, B);
692     A[] = C;
693 }
expr_without_variable(A)694 expr_without_variable(A) ::= expr(B) GREATERTHAN expr(C). {
695     A = new PHP_Parser_CoreyyToken(B->string . ' > ' . C->string, B);
696     A[] = C;
697 }
expr_without_variable(A)698 expr_without_variable(A) ::= expr(B) T_IS_GREATER_OR_EQUAL expr(C). {
699     A = new PHP_Parser_CoreyyToken(B->string . ' >= ' . C->string, B);
700     A[] = C;
701 }
expr_without_variable(A)702 expr_without_variable(A) ::= expr(B) T_INSTANCEOF class_name_reference(CL). {
703     $c = is_string(CL) ? CL : CL->string;
704     A = new PHP_Parser_CoreyyToken(B->string . ' instanceof ' . $c, B);
705     if (!is_string(CL)) {
706         A[] = CL;
707     }
708 }
expr_without_variable(A)709 expr_without_variable(A) ::= LPAREN expr(B) RPAREN. {
710     A = new PHP_Parser_CoreyyToken('(' . B->string . ')', B);
711 }
expr_without_variable(A)712 expr_without_variable(A) ::= expr(B) QUESTION
713         expr(C) COLON
714         expr(D). {
715     A = new PHP_Parser_CoreyyToken(B->string . ' ? ' . C->string . ' : ' . D->string, B);
716     A[] = C;
717     A[] = D;
718 }
expr_without_variable(A)719 expr_without_variable(A) ::= internal_functions_in_yacc(B). {A = B;}
expr_without_variable(A)720 expr_without_variable(A) ::= T_INT_CAST expr(B). {
721     A = new PHP_Parser_CoreyyToken('(int) ' . B->string, B);
722 }
expr_without_variable(A)723 expr_without_variable(A) ::= T_DOUBLE_CAST expr(B). {
724     A = new PHP_Parser_CoreyyToken('(double) ' . B->string, B);
725 }
expr_without_variable(A)726 expr_without_variable(A) ::= T_STRING_CAST expr(B). {
727     A = new PHP_Parser_CoreyyToken('(string) ' . B->string, B);
728 }
expr_without_variable(A)729 expr_without_variable(A) ::= T_ARRAY_CAST expr(B). {
730     A = new PHP_Parser_CoreyyToken('(array) ' . B->string, B);
731 }
expr_without_variable(A)732 expr_without_variable(A) ::= T_OBJECT_CAST expr(B). {
733     A = new PHP_Parser_CoreyyToken('(object) ' . B->string, B);
734 }
expr_without_variable(A)735 expr_without_variable(A) ::= T_BINARY_CAST expr(B). {
736     A = new PHP_Parser_CoreyyToken('(binary) ' . B->string, B);
737 }
expr_without_variable(A)738 expr_without_variable(A) ::= T_BOOL_CAST expr(B). {
739     A = new PHP_Parser_CoreyyToken('(bool) ' . B->string, B);
740 }
expr_without_variable(A)741 expr_without_variable(A) ::= T_UNSET_CAST expr(B). {
742     A = new PHP_Parser_CoreyyToken('(unset) ' . B->string, B);
743 }
expr_without_variable(A)744 expr_without_variable(A) ::= T_EXIT exit_expr(B). {
745     A = new PHP_Parser_CoreyyToken('exit ' . B->string, B);
746 }
expr_without_variable(A)747 expr_without_variable(A) ::= AT expr(B). {
748     A = new PHP_Parser_CoreyyToken('@' . B->string, B);
749 }
expr_without_variable(A)750 expr_without_variable(A) ::= scalar(B). {
751     A = new PHP_Parser_CoreyyToken(B->string, B);
752 }
expr_without_variable(A)753 expr_without_variable(A) ::= expr_without_variable_t_array LPAREN array_pair_list(B) RPAREN. {
754     $this->lex->stopTrackingWhitespace();
755     A = new PHP_Parser_CoreyyToken('array(' . B->string . ')', B);
756 }
expr_without_variable(A)757 expr_without_variable(A) ::= BACKQUOTE encaps_list(B) BACKQUOTE. {
758     A = new PHP_Parser_CoreyyToken('`' . B->string . '`');
759 }
expr_without_variable(A)760 expr_without_variable(A) ::= T_PRINT expr(B). {
761     A = new PHP_Parser_CoreyyToken('print ' . B->string, B);
762 }
763 
764 expr_without_variable_t_array ::= T_ARRAY. {$this->lex->trackWhitespace();}
765 
exit_expr(A)766 exit_expr(A) ::= LPAREN RPAREN. {A = new PHP_Parser_CoreyyToken('()');}
exit_expr(A)767 exit_expr(A) ::= LPAREN expr(B) RPAREN. {A = new PHP_Parser_CoreyyToken('(' . B->string . ')', B);}
exit_expr(A)768 exit_expr(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
769 
770 common_scalar(A) ::=
771         T_LNUMBER
772        |T_DNUMBER
773        |T_CONSTANT_ENCAPSED_STRING
774        |T_LINE
775        |T_FILE
776        |T_CLASS_C
777        |T_METHOD_C
778        |T_FUNC_C(B). {A = B;}
779 
780 /* compile-time evaluated scalars */
static_scalar(A)781 static_scalar(A) ::= common_scalar(B). {A = B;}
static_scalar(A)782 static_scalar(A) ::= T_STRING(B). {A = B;}
static_scalar(A)783 static_scalar(A) ::= PLUS static_scalar(B). {A = B;}
static_scalar(A)784 static_scalar(A) ::= MINUS static_scalar(B). {A = '-' . B;}
static_scalar(A)785 static_scalar(A) ::= static_scalar_t_array(B) LPAREN(C) static_array_pair_list(D) RPAREN(E). {
786     A = B . C . D . E;
787     // have to do all because of nested arrays
788     $this->lex->stopTrackingWhitespace(); // we only need whitespace for
789                                           // array default values
790 }
static_scalar(A)791 static_scalar(A) ::= static_class_constant(B). {A = B;}
792 
static_scalar_t_array(A)793 static_scalar_t_array(A) ::= T_ARRAY(B). {
794     $this->lex->trackWhitespace();
795     A = B;
796 }
797 
static_array_pair_list(A)798 static_array_pair_list(A) ::= non_empty_static_array_pair_list(B). {A = B;}
static_array_pair_list(A)799 static_array_pair_list(A) ::= non_empty_static_array_pair_list(B) COMMA(C). {
800     A = B . C;
801 }
static_array_pair_list(A)802 static_array_pair_list(A) ::= . {A = '';}
803 
non_empty_static_array_pair_list(A)804 non_empty_static_array_pair_list(A) ::= non_empty_static_array_pair_list(B) COMMA(C) static_scalar(D) T_DOUBLE_ARROW(E) static_scalar(F). {
805     A = B . C . D . E . F;
806 }
non_empty_static_array_pair_list(A)807 non_empty_static_array_pair_list(A) ::= non_empty_static_array_pair_list(B) COMMA(C) static_scalar(D). {
808     A = B . C . D;
809 }
non_empty_static_array_pair_list(A)810 non_empty_static_array_pair_list(A) ::= static_scalar(B) T_DOUBLE_ARROW(C) static_scalar(D). {
811     A = B . C . D;
812 }
non_empty_static_array_pair_list(A)813 non_empty_static_array_pair_list(A) ::= static_scalar(B). {A = B;}
814 
static_class_constant(A)815 static_class_constant(A) ::= T_STRING(B) T_PAAMAYIM_NEKUDOTAYIM T_STRING(C). {
816     A = B . '::' . C;
817 }
818 
foreach_optional_arg(A)819 foreach_optional_arg(A) ::= T_DOUBLE_ARROW foreach_variable(B). {
820     A = new PHP_Parser_CoreyyToken(' => ' . B->string, B);
821 }
822 foreach_optional_arg ::= .
823 
foreach_variable(A)824 foreach_variable(A) ::= w_variable(B). {A = B;}
foreach_variable(A)825 foreach_variable(A) ::= AMPERSAND w_variable(B). {
826     A = new PHP_Parser_CoreyyToken('&' . B->string, B);
827 }
828 
for_statement(A)829 for_statement(A) ::= statement(B). {A = B;}
for_statement(A)830 for_statement(A) ::= COLON inner_statement_list(B) T_ENDFOR SEMI. {A = B;}
831 
foreach_statement(A)832 foreach_statement(A) ::= statement(B). {A = B;}
foreach_statement(A)833 foreach_statement(A) ::= COLON inner_statement_list(B) T_ENDFOREACH SEMI. {A = B;}
834 
835 
declare_statement(A)836 declare_statement(A) ::= statement(B). {A = B;}
declare_statement(A)837 declare_statement(A) ::= COLON inner_statement_list(B) T_ENDDECLARE SEMI. {A = B;}
838 
declare_list(A)839 declare_list(A) ::= T_STRING(B) EQUALS static_scalar(C). {
840     A = new PHP_Parser_CoreyyToken(B . ' = ' . C, array('declare' => B, 'default' => C));
841 }
declare_list(A)842 declare_list(A) ::= declare_list(DEC) COMMA T_STRING(B) EQUALS static_scalar(C). {
843     A = new PHP_Parser_CoreyyToken(DEC->string . ', ' . B . ' = ' . C);
844     A[] = DEC;
845     A[] = array('declare' => B, 'default' => C);
846 }
847 
switch_case_list(A)848 switch_case_list(A) ::= LCURLY case_list(B) RCURLY. {A = B;}
switch_case_list(A)849 switch_case_list(A) ::= LCURLY SEMI case_list(B) RCURLY. {A = B;}
switch_case_list(A)850 switch_case_list(A) ::= COLON case_list(B) T_ENDSWITCH SEMI. {A = B;}
switch_case_list(A)851 switch_case_list(A) ::= COLON SEMI case_list(B) T_ENDSWITCH SEMI. {A = B;}
852 
case_list(A)853 case_list(A) ::= case_list(LIST) T_CASE expr(B) case_separator inner_statement_list(C). {
854     A = LIST;
855     A[] = B;
856     A[] = C;
857 }
case_list(A)858 case_list(A) ::= case_list(LIST) T_DEFAULT case_separator inner_statement_list(B). {
859     A = LIST;
860     A[] = B;
861 }
case_list(A)862 case_list(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
863 
864 case_separator ::= COLON|SEMI.
865 
866 while_statement(A) ::= statement(B). {A = B;}
while_statement(A)867 while_statement(A) ::= COLON inner_statement_list(B) T_ENDWHILE SEMI. {A = B;}
868 
elseif_list(A)869 elseif_list(A) ::= elseif_list(B) T_ELSEIF LPAREN expr(C) RPAREN statement(D). {
870     A = B;
871     A[] = C;
872     A[] = D;
873 }
elseif_list(A)874 elseif_list(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
875 
new_elseif_list(A)876 new_elseif_list(A) ::= new_elseif_list(B) T_ELSEIF LPAREN expr(C) RPAREN COLON inner_statement_list(D) . {
877     A = B;
878     A[] = C;
879     A[] = D;
880 }
new_elseif_list(A)881 new_elseif_list(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
882 
else_single(A)883 else_single(A) ::= T_ELSE statement(B). {A = B;}
else_single(A)884 else_single(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
885 
new_else_single(A)886 new_else_single(A) ::= T_ELSE COLON inner_statement_list(B). {A = B;}
new_else_single(A)887 new_else_single(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
888 
parameter_list(A)889 parameter_list(A) ::= non_empty_parameter_list(B). {A = B;}
parameter_list(A)890 parameter_list(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
891 
non_empty_parameter_list(A)892 non_empty_parameter_list(A) ::= optional_class_type(T) T_VARIABLE(V). {
893     A = new PHP_Parser_CoreyyToken(T . V, array(
894             array(
895                 'typehint' => T,
896                 'param' => V,
897                 'isreference' => false,
898                 'default' => null,
899             )
900         ));
901 }
non_empty_parameter_list(A)902 non_empty_parameter_list(A) ::= optional_class_type(T) AMPERSAND T_VARIABLE(V). {
903     A = new PHP_Parser_CoreyyToken(T . '&' . V, array(
904             array(
905                 'typehint' => T,
906                 'param' => V,
907                 'isreference' => true,
908                 'default' => null,
909             )
910         ));
911 }
non_empty_parameter_list(A)912 non_empty_parameter_list(A) ::= optional_class_type(T) AMPERSAND T_VARIABLE(V) EQUALS static_scalar(D). {
913     A = new PHP_Parser_CoreyyToken(T . '&' . V . ' = ' . D, array(
914             array(
915                 'typehint' => T,
916                 'param' => V,
917                 'isreference' => true,
918                 'default' => D,
919             )
920         ));
921 }
non_empty_parameter_list(A)922 non_empty_parameter_list(A) ::= optional_class_type(T) T_VARIABLE(V) EQUALS static_scalar(D). {
923     A = new PHP_Parser_CoreyyToken(T . V . ' = ' . D, array(
924             array(
925                 'typehint' => T,
926                 'param' => V,
927                 'isreference' => false,
928                 'default' => D,
929             )
930         ));
931 }
non_empty_parameter_list(A)932 non_empty_parameter_list(A) ::= non_empty_parameter_list(list) COMMA optional_class_type(T) T_VARIABLE(V). {
933     A = new PHP_Parser_CoreyyToken(list->string . ', ' . T . V, list);
934     A[] =
935         array(
936             'typehint' => T,
937             'param' => V,
938             'isreference' => false,
939             'default' => null,
940         );
941 }
non_empty_parameter_list(A)942 non_empty_parameter_list(A) ::= non_empty_parameter_list(list) COMMA optional_class_type(T) AMPERSAND T_VARIABLE(V). {
943     A = new PHP_Parser_CoreyyToken(list->string . ', ' . T . '&' . V, list);
944     A[] =
945         array(
946             'typehint' => T,
947             'param' => V,
948             'isreference' => true,
949             'default' => null,
950         );
951 }
non_empty_parameter_list(A)952 non_empty_parameter_list(A) ::= non_empty_parameter_list(list) COMMA optional_class_type(T) AMPERSAND T_VARIABLE(V) EQUALS static_scalar(D). {
953     A = new PHP_Parser_CoreyyToken(list->string . ', ' . T . V . ' = ' . D, list);
954     A[] =
955         array(
956             'typehint' => T,
957             'param' => V,
958             'isreference' => true,
959             'default' => D,
960         );
961 }
non_empty_parameter_list(A)962 non_empty_parameter_list(A) ::= non_empty_parameter_list(list) COMMA optional_class_type(T) T_VARIABLE(V) EQUALS static_scalar(D). {
963     A = new PHP_Parser_CoreyyToken(list->string . ', ' . T . V . ' = ' . D, list);
964     A[] =
965         array(
966             'typehint' => T,
967             'param' => V,
968             'isreference' => false,
969             'default' => D,
970         );
971 }
972 
973 
974 optional_class_type(A) ::= T_STRING|T_ARRAY(B). {A = B;}
optional_class_type(A)975 optional_class_type(A) ::= . {A = '';}
976 
function_call_parameter_list(A)977 function_call_parameter_list(A) ::= non_empty_function_call_parameter_list(B). {A = B;}
function_call_parameter_list(A)978 function_call_parameter_list(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
979 
non_empty_function_call_parameter_list(A)980 non_empty_function_call_parameter_list(A) ::= expr_without_variable(B). {A = new PHP_Parser_CoreyyToken(B);}
non_empty_function_call_parameter_list(A)981 non_empty_function_call_parameter_list(A) ::= variable(B). {A = new PHP_Parser_CoreyyToken(B);}
non_empty_function_call_parameter_list(A)982 non_empty_function_call_parameter_list(A) ::= AMPERSAND w_variable(B). {
983     if (B instanceof PHP_Parser_CoreyyToken) {
984         $b = B->string;
985     } else {
986         $b = (string) B;
987     }
988     A = new PHP_Parser_CoreyyToken('&' . $b, B);}
non_empty_function_call_parameter_list(A)989 non_empty_function_call_parameter_list(A) ::= non_empty_function_call_parameter_list(LIST) COMMA expr_without_variable(B). {
990     if (B instanceof PHP_Parser_CoreyyToken) {
991         $b = B->string;
992     } else {
993         $b = (string) B;
994     }
995     A = new PHP_Parser_CoreyyToken(LIST->string . ', ' . $b, LIST);
996     A[] = B;
997 }
non_empty_function_call_parameter_list(A)998 non_empty_function_call_parameter_list(A) ::= non_empty_function_call_parameter_list(LIST) COMMA variable(B). {
999     if (B instanceof PHP_Parser_CoreyyToken) {
1000         $b = B->string;
1001     } else {
1002         $b = (string) B;
1003     }
1004     A = new PHP_Parser_CoreyyToken(LIST->string . ', ' . $b, LIST);
1005     A[] = B;
1006 }
non_empty_function_call_parameter_list(A)1007 non_empty_function_call_parameter_list(A) ::= non_empty_function_call_parameter_list(LIST) COMMA AMPERSAND w_variable(B). {
1008     if (B instanceof PHP_Parser_CoreyyToken) {
1009         $b = B->string;
1010     } else {
1011         $b = (string) B;
1012     }
1013     A = new PHP_Parser_CoreyyToken(LIST->string . ', &' . $b, LIST);
1014     A[] = B;
1015 }
1016 
global_var_list(A)1017 global_var_list(A) ::= global_var_list(B) COMMA global_var(C). {
1018     A = B;
1019     A[] = C;
1020 }
global_var_list(A)1021 global_var_list(A) ::= global_var(B). {A = B;}
1022 
global_var(A)1023 global_var(A) ::= T_VARIABLE(B). {A = new PHP_Parser_CoreyyToken(B, array('global' => B));}
global_var(A)1024 global_var(A) ::= DOLLAR r_variable(B). {A = new PHP_Parser_CoreyyToken('$' . B->string, B);}
global_var(A)1025 global_var(A) ::= DOLLAR LCURLY expr(B) RCURLY.{
1026     A = new PHP_Parser_CoreyyToken('${' . B->string . '}', B);
1027 }
1028 
1029 
static_var_list(A)1030 static_var_list(A) ::= static_var_list(B) COMMA T_VARIABLE(C). {
1031     A = new PHP_Parser_CoreyyToken('');
1032     A[] = B;
1033     A[] = array('static' => C, 'default' => null);
1034 }
static_var_list(A)1035 static_var_list(A) ::= static_var_list(B) COMMA T_VARIABLE(C) EQUALS static_scalar(D). {
1036     A = new PHP_Parser_CoreyyToken('');
1037     A[] = B;
1038     A[] = array('static' => C, 'default' => D);
1039 }
static_var_list(A)1040 static_var_list(A) ::= T_VARIABLE(B). {
1041     A = new PHP_Parser_CoreyyToken('', array('static' => B, 'default' => null));
1042 }
static_var_list(A)1043 static_var_list(A) ::= T_VARIABLE(B) EQUALS static_scalar(C). {
1044     A = new PHP_Parser_CoreyyToken('', array('static' => B, 'default' => C));
1045 }
1046 
class_statement_list(A)1047 class_statement_list(A) ::= class_statement_list(list) class_statement(B). {
1048     A = list;
1049     A[] = B;
1050 }
class_statement_list(A)1051 class_statement_list(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
1052 
class_statement(A)1053 class_statement(A) ::= variable_modifiers(mod) class_variable_declaration(B) SEMI. {
1054     $a = array();
1055     foreach (B as $item) {
1056         $a[] = array(
1057             'type' => 'var',
1058             'name' => $item['name'],
1059             'line' => $item['line'],
1060             'default' => $item['default'],
1061             'modifiers' => mod,
1062             'doc' => $item['doc'],
1063             'parseddoc' => $item['parseddoc'],
1064             'docline' => $item['docline'],
1065         );
1066     }
1067     A = new PHP_Parser_CoreyyToken('', $a);
1068 }
class_statement(A)1069 class_statement(A) ::= class_constant_declaration(B) SEMI. {
1070     $a = array();
1071     foreach (B as $item) {
1072         $a[] = array(
1073             'type' => 'const',
1074             'name' => $item['name'],
1075             'line' => $item['line'],
1076             'value' => $item['value'],
1077             'doc' => $item['doc'],
1078             'parseddoc' => $item['parseddoc'],
1079             'docline' => $item['docline'],
1080         );
1081     }
1082     A = new PHP_Parser_CoreyyToken('', $a);
1083 }
get_method_line(A)1084 get_method_line(A) ::= T_FUNCTION. {
1085     A = array($this->lex->line, $lastcom);
1086 }
class_statement(A)1087 class_statement(A) ::= method_modifiers(mod) get_method_line(LINE) is_reference T_STRING(B) LPAREN parameter_list(params) RPAREN method_body(M). {
1088     list($doc, $parsed, $line) = LINE[1];
1089     A = new PHP_Parser_CoreyyToken('', array(
1090             array(
1091                 'type' => 'method',
1092                 'name' => B,
1093                 'startline' => LINE[0],
1094                 'endline' => $this->lex->line,
1095                 'parameters' => params->metadata,
1096                 'modifiers' => mod,
1097                 'info' => M->metadata,
1098                 'doc' => $doc,
1099                 'parseddoc' => $parsed,
1100                 'docline' => $line,
1101             )
1102         ));
1103 }
1104 
1105 
method_body(A)1106 method_body(A) ::= SEMI. /* abstract method */ {A = new PHP_Parser_CoreyyToken('');}
method_body(A)1107 method_body(A) ::= LCURLY inner_statement_list(B) RCURLY. {
1108     A = B;
1109 }
1110 
variable_modifiers(A)1111 variable_modifiers(A) ::= non_empty_member_modifiers(B). {A = B;}
variable_modifiers(A)1112 variable_modifiers(A) ::= T_VAR. {A = array('public');}
1113 
method_modifiers(A)1114 method_modifiers(A) ::= non_empty_member_modifiers(B). {A = B;}
method_modifiers(A)1115 method_modifiers(A) ::= . {A = array('public');}
1116 
non_empty_member_modifiers(A)1117 non_empty_member_modifiers(A) ::= member_modifier(B). {A = array(B);}
non_empty_member_modifiers(A)1118 non_empty_member_modifiers(A) ::= non_empty_member_modifiers(mod) member_modifier(B). {
1119     A = mod;
1120     A[] = B;
1121 }
1122 
1123 member_modifier(A) ::= T_PUBLIC|T_PROTECTED|T_PRIVATE|T_STATIC|T_ABSTRACT|T_FINAL(B). {A = strtolower(B);}
1124 
get_variable_line(A)1125 get_variable_line(A) ::= T_VARIABLE(B). {
1126     A = array(B, $this->lex->line);
1127 }
1128 
class_variable_declaration(A)1129 class_variable_declaration(A) ::= class_variable_declaration(LIST) COMMA get_variable_line(var). {
1130     list($doc, $parsed, $line) = $this->lex->getLastComment();
1131     A = LIST;
1132     A[] = array(
1133         'name' => var[0],
1134         'default' => null,
1135         'line' => var[1],
1136         'doc' => $doc,
1137         'parseddoc' => $parsed,
1138         'docline' => $line,
1139     );
1140 }
class_variable_declaration(A)1141 class_variable_declaration(A) ::= class_variable_declaration(LIST) COMMA get_variable_line(var) EQUALS static_scalar(val). {
1142     list($doc, $parsed, $line) = $this->lex->getLastComment();
1143     A = LIST;
1144     A[] = array(
1145         'name' => var[0],
1146         'default' => val,
1147         'line' => var[1],
1148         'doc' => $doc,
1149         'parseddoc' => $parsed,
1150         'docline' => $line,
1151     );
1152 }
class_variable_declaration(A)1153 class_variable_declaration(A) ::= T_VARIABLE(B). {
1154     list($doc, $parsed, $line) = $this->lex->getLastComment();
1155     A = array(
1156             array(
1157                 'name' => B,
1158                 'default' => null,
1159                 'line' => $this->lex->line,
1160                 'doc' => $doc,
1161                 'parseddoc' => $parsed,
1162                 'docline' => $line,
1163             )
1164         );
1165 }
class_variable_declaration(A)1166 class_variable_declaration(A) ::= get_variable_line(var) EQUALS static_scalar(val). {
1167     list($doc, $parsed, $line) = $this->lex->getLastComment();
1168     A = array(
1169             array(
1170                 'name' => var[0],
1171                 'default' => val,
1172                 'line' => var[1],
1173                 'doc' => $doc,
1174                 'parseddoc' => $parsed,
1175                 'docline' => $line,
1176             )
1177         );
1178 }
1179 
get_constant_line(A)1180 get_constant_line(A) ::= T_STRING(B). {
1181     $doc = $this->lex->getLastComment();
1182     A = array(B, $this->lex->line, $doc);
1183 }
1184 
class_constant_declaration(A)1185 class_constant_declaration(A) ::= class_constant_declaration(LIST) COMMA get_constant_line(n) EQUALS static_scalar(v). {
1186     A = LIST;
1187     list($doc, $parsed, $line) = n[2];
1188     A[] = array('name' => n[0], 'value' => v, 'line' => n[1],
1189        'doc' => $doc,
1190        'parseddoc' => $parsed,
1191        'docline' => $line,
1192     );
1193 }
class_constant_declaration(A)1194 class_constant_declaration(A) ::= T_CONST get_constant_line(n) EQUALS static_scalar(v). {
1195     list($doc, $parsed, $line) = n[2];
1196     A = array(
1197         array('name' => n[0], 'value' => v, 'line' => n[1],
1198            'doc' => $doc,
1199            'parseddoc' => $parsed,
1200            'docline' => $line,
1201         )
1202     );
1203 }
1204 
echo_expr_list(A)1205 echo_expr_list(A) ::= echo_expr_list(B) COMMA expr(C). {A = B;A[] = C;}
echo_expr_list(A)1206 echo_expr_list(A) ::= expr(B). {A = B;}
1207 
unset_variables(A)1208 unset_variables(A) ::= unset_variable(B). {A = B;}
unset_variables(A)1209 unset_variables(A) ::= unset_variables(B) COMMA unset_variable(C). {
1210     A = B;
1211     A[] = C;
1212 }
1213 
unset_variable(A)1214 unset_variable(A) ::= variable(B). {A = B;}
1215 
use_filename(A)1216 use_filename(A) ::= T_CONSTANT_ENCAPSED_STRING(B). {A = B;}
use_filename(A)1217 use_filename(A) ::= LPAREN T_CONSTANT_ENCAPSED_STRING(B) RPAREN. {
1218     A = '(' . B . ')';
1219 }
1220 
r_variable(A)1221 r_variable(A) ::= variable(B). {A = B;}
1222 
w_variable(A)1223 w_variable(A) ::= variable(B). {A = B;}
1224 
rw_variable(A)1225 rw_variable(A) ::= variable(B). {A = B;}
1226 
variable(A)1227 variable(A) ::= base_variable_with_function_calls(BASE) T_OBJECT_OPERATOR object_property(PROP) method_or_not(IS_METHOD) variable_properties(VARP). {
1228     A = new PHP_Parser_CoreyyToken(BASE->string . '->' . PROP->string .
1229         IS_METHOD->string . VARP->string, array());
1230     A[] = BASE;
1231     if (is_array(PROP)) {
1232         A[] = PROP;
1233     } else {
1234         if (IS_METHOD->string) {
1235             A[] = array(
1236                 'uses' => 'method',
1237                 'name' => trim(PROP),
1238             );
1239         } else {
1240             A[] = array(
1241                 'uses' => 'var',
1242                 'name' => trim(PROP),
1243             );
1244         }
1245     }
1246     A[] = VARP;
1247 }
variable(A)1248 variable(A) ::= base_variable_with_function_calls(B). {A = B;}
1249 
variable_properties(A)1250 variable_properties(A) ::= variable_properties(B) variable_property(C).
1251 variable_properties(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
1252 
variable_property(A)1253 variable_property(A) ::= T_OBJECT_OPERATOR object_property(B) method_or_not(C). {
1254     A = new PHP_Parser_CoreyyToken('->' . B->string . C->string, B);
1255     A[] = C;
1256 }
1257 
method_or_not(A)1258 method_or_not(A) ::= LPAREN function_call_parameter_list(B) RPAREN. {
1259     A = new PHP_Parser_CoreyyToken('(' . B . ')', B);
1260 }
method_or_not(A)1261 method_or_not(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
1262 
variable_without_objects(A)1263 variable_without_objects(A) ::= reference_variable(B). {A = B;}
variable_without_objects(A)1264 variable_without_objects(A) ::= simple_indirect_reference(I) reference_variable(B). {
1265     A = new PHP_Parser_CoreyyToken(I . B->string, B);
1266 }
1267 
static_member(A)1268 static_member(A) ::= fully_qualified_class_name(CLASS) T_PAAMAYIM_NEKUDOTAYIM variable_without_objects(VAR). {
1269     A = new PHP_Parser_CoreyyToken(CLASS . '::' . VAR->string, array(
1270         array(
1271             'usedclass' => CLASS,
1272         )
1273     ));
1274     A[] = VAR;
1275 }
1276 
base_variable_with_function_calls(A)1277 base_variable_with_function_calls(A) ::= base_variable(B). {A = new PHP_Parser_CoreyyToken(B);}
base_variable_with_function_calls(A)1278 base_variable_with_function_calls(A) ::= function_call(B). {A = B;}
1279 
base_variable(A)1280 base_variable(A) ::= reference_variable(B). {A = B;}
base_variable(A)1281 base_variable(A) ::= simple_indirect_reference(I) reference_variable(B). {
1282     A = new PHP_Parser_CoreyyToken(I . B->string, B);
1283 }
base_variable(A)1284 base_variable(A) ::= static_member(B). {A = B;}
1285 
reference_variable(A)1286 reference_variable(A) ::= reference_variable(REF) LBRACKET dim_offset(DIM) RBRACKET. {
1287     if (in_array(REF->string, array('$_GET', '$_POST', '$GLOBALS', '$_COOKIE', '$_REQUEST',
1288         '$_ENV', '$_FILES', '$_SERVER', '$HTTP_COOKIE_VARS', '$HTTP_ENV_VARS',
1289         '$HTTP_POST_FILES', '$HTTP_POST_VARS', '$HTTP_SERVER_VARS'))) {
1290         A = new PHP_Parser_CoreyyToken(REF->string . '[' . DIM->string . ']',
1291         array(
1292             array(
1293             'superglobal' => REF->string,
1294             'contents' => REF->string . '[' . DIM->string . ']'
1295         )));
1296     } else {
1297         A = new PHP_Parser_CoreyyToken(REF->string . '[' . DIM->string . ']', array());
1298     }
1299     A[] = REF;
1300     A[] = DIM;
1301 }
reference_variable(A)1302 reference_variable(A) ::= reference_variable(REF) LCURLY expr(DIM) RCURLY. {
1303     A = new PHP_Parser_CoreyyToken(REF->string . '{' . DIM->string . '}', array());
1304     A[] = REF;
1305     A[] = DIM;
1306 }
reference_variable(A)1307 reference_variable(A) ::= compound_variable(B). {A = new PHP_Parser_CoreyyToken(B);}
1308 
compound_variable(A)1309 compound_variable(A) ::= T_VARIABLE(B). {A = B;}
compound_variable(A)1310 compound_variable(A) ::= DOLLAR LCURLY expr(B) RCURLY. {A = new PHP_Parser_CoreyyToken('${' . B->string . '}', B);}
1311 
dim_offset(A)1312 dim_offset(A) ::= expr(B). {A = new PHP_Parser_CoreyyToken(B);}
dim_offset(A)1313 dim_offset(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
1314 
object_property(A)1315 object_property(A) ::= object_dim_list(B). {A = B;}
object_property(A)1316 object_property(A) ::= variable_without_objects(B). {A = B;}
1317 
object_dim_list(A)1318 object_dim_list(A) ::= object_dim_list(LIST) LBRACKET dim_offset(B) RBRACKET. {
1319     A = new PHP_Parser_CoreyyToken(LIST->string . '[' . B->string . ']', LIST);
1320     A[] = B;
1321 }
object_dim_list(A)1322 object_dim_list(A) ::= object_dim_list(LIST) LCURLY expr(B) RCURLY. {
1323     A = new PHP_Parser_CoreyyToken(LIST->string . '{' . B->string . '}', LIST);
1324     A[] = B;
1325 }
object_dim_list(A)1326 object_dim_list(A) ::= variable_name(B). {A = new PHP_Parser_CoreyyToken(B);}
1327 
variable_name(A)1328 variable_name(A) ::= T_STRING(B). {A = B;}
variable_name(A)1329 variable_name(A) ::= LCURLY expr(B) RCURLY. {A = new PHP_Parser_CoreyyToken('{' . B->string . '}', B);}
1330 
simple_indirect_reference(A)1331 simple_indirect_reference(A) ::= DOLLAR. {A = '$';}
simple_indirect_reference(A)1332 simple_indirect_reference(A) ::= simple_indirect_reference(B) DOLLAR. {A = B . '$';}
1333 
assignment_list(A)1334 assignment_list(A) ::= assignment_list(B) COMMA assignment_list_element(C). {
1335     A = new PHP_Parser_CoreyyToken(B->string . ', ' . C->string, B);
1336     A[] = C;
1337 }
assignment_list(A)1338 assignment_list(A) ::= assignment_list_element(B). {A = B;}
1339 
assignment_list_element(A)1340 assignment_list_element(A) ::= variable(B). {A = B;}
assignment_list_element(A)1341 assignment_list_element(A) ::= T_LIST LPAREN assignment_list(B) RPAREN. {
1342     A = new PHP_Parser_CoreyyToken('list(' . B->string . ')', B);
1343 }
assignment_list_element(A)1344 assignment_list_element(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
1345 
array_pair_list(A)1346 array_pair_list(A) ::= non_empty_array_pair_list(B) possible_comma(C). {
1347     A = new PHP_Parser_CoreyyToken(B->string . C, B);
1348 }
array_pair_list(A)1349 array_pair_list(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
1350 
non_empty_array_pair_list(A)1351 non_empty_array_pair_list(A) ::= expr(B) T_DOUBLE_ARROW AMPERSAND w_variable(C). {
1352     A = new PHP_Parser_CoreyyToken(B->string . ' => &' . C->string, B);
1353     A[] = C;
1354 }
non_empty_array_pair_list(A)1355 non_empty_array_pair_list(A) ::= expr(B). {A = B;}
non_empty_array_pair_list(A)1356 non_empty_array_pair_list(A) ::= AMPERSAND w_variable(B). {
1357     A = new PHP_Parser_CoreyyToken('&' . B->string, B);
1358 }
non_empty_array_pair_list(A)1359 non_empty_array_pair_list(A) ::= non_empty_array_pair_list(B) COMMA expr(C) T_DOUBLE_ARROW expr(D). {
1360     A = new PHP_Parser_CoreyyToken(B->string . ', ' . C->string . ' => ' . D->string, B);
1361     A[] = C;
1362     A[] = D;
1363 }
non_empty_array_pair_list(A)1364 non_empty_array_pair_list(A) ::= non_empty_array_pair_list(B) COMMA expr(C). {
1365     A = new PHP_Parser_CoreyyToken(B->string . ', ' . C->string, B);
1366     A[] = C;
1367 }
non_empty_array_pair_list(A)1368 non_empty_array_pair_list(A) ::= expr(B) T_DOUBLE_ARROW expr(C). {
1369     A = new PHP_Parser_CoreyyToken(B->string . ' => ' . C->string, B);
1370     A[] = C;
1371 }
non_empty_array_pair_list(A)1372 non_empty_array_pair_list(A) ::= non_empty_array_pair_list(B) COMMA expr(C) T_DOUBLE_ARROW AMPERSAND w_variable(D). {
1373     A = new PHP_Parser_CoreyyToken(B->string . ', ' . C->string . ' => &' . D->string, B);
1374     A[] = C;
1375     A[] = D;
1376 }
non_empty_array_pair_list(A)1377 non_empty_array_pair_list(A) ::= non_empty_array_pair_list(B) COMMA AMPERSAND w_variable(C). {
1378     A = new PHP_Parser_CoreyyToken(B->string . ', &' . C->string, B);
1379     A[] = C;
1380 }
1381 
1382 
encaps_list(A)1383 encaps_list(A) ::= encaps_list(B) encaps_var(C). {
1384     A = new PHP_Parser_CoreyyToken(B->string . C, B);
1385     A[] = C;
1386 }
encaps_list(A)1387 encaps_list(A) ::= encaps_list(B) T_STRING(C). {
1388     A = new PHP_Parser_CoreyyToken(B->string . C, B);
1389 }
encaps_list(A)1390 encaps_list(A) ::= encaps_list(B) T_NUM_STRING(C). {
1391     A = new PHP_Parser_CoreyyToken(B->string . C, B);
1392 }
encaps_list(A)1393 encaps_list(A) ::= encaps_list(B) T_ENCAPSED_AND_WHITESPACE(C). {
1394     A = new PHP_Parser_CoreyyToken(B->string . C, B);
1395 }
encaps_list(A)1396 encaps_list(A) ::= encaps_list(B) T_CHARACTER(C). {
1397     A = new PHP_Parser_CoreyyToken(B->string . C, B);
1398 }
encaps_list(A)1399 encaps_list(A) ::= encaps_list(B) T_BAD_CHARACTER(C). {
1400     A = new PHP_Parser_CoreyyToken(B->string . C, B);
1401 }
encaps_list(A)1402 encaps_list(A) ::= encaps_list(B) LBRACKET. {
1403     A = new PHP_Parser_CoreyyToken(B->string . '[', B);
1404 }
encaps_list(A)1405 encaps_list(A) ::= encaps_list(B) RBRACKET. {
1406     A = new PHP_Parser_CoreyyToken(B->string . ']', B);
1407 }
encaps_list(A)1408 encaps_list(A) ::= encaps_list(B) LCURLY. {
1409     A = new PHP_Parser_CoreyyToken(B->string . '{', B);
1410 }
encaps_list(A)1411 encaps_list(A) ::= encaps_list(B) RCURLY. {
1412     A = new PHP_Parser_CoreyyToken(B->string . '}', B);
1413 }
encaps_list(A)1414 encaps_list(A) ::= encaps_list(B) T_OBJECT_OPERATOR. {
1415     A = new PHP_Parser_CoreyyToken(B->string . '->', B);
1416 }
encaps_list(A)1417 encaps_list(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
1418 
encaps_var(A)1419 encaps_var(A) ::= T_VARIABLE(B). {A = new PHP_Parser_CoreyyToken(B);}
1420 encaps_var(A) ::= T_VARIABLE(B) LBRACKET T_STRING|T_NUM_STRING|T_VARIABLE(C) RBRACKET. {
1421     if (in_array(B, array('$_GET', '$_POST', '$GLOBALS', '$_COOKIE', '$_REQUEST',
1422         '$_ENV', '$_FILES', '$_SERVER', '$HTTP_COOKIE_VARS', '$HTTP_ENV_VARS',
1423         '$HTTP_POST_FILES', '$HTTP_POST_VARS', '$HTTP_SERVER_VARS'))) {
1424         A = new PHP_Parser_CoreyyToken(B . '[' . C . ']',
1425         array(
1426             array(
1427             'superglobal' => B,
1428             'contents' => C
1429         )));
1430     } else {
1431         A = new PHP_Parser_CoreyyToken(B . '[' . C . ']');
1432     }
1433 }
encaps_var(A)1434 encaps_var(A) ::= T_VARIABLE(B) T_OBJECT_OPERATOR T_STRING(C). {
1435     A = new PHP_Parser_CoreyyToken(B . '->' . C);
1436 }
encaps_var(A)1437 encaps_var(A) ::= T_DOLLAR_OPEN_CURLY_BRACES expr(B) RCURLY. {
1438     A = new PHP_Parser_CoreyyToken('${' . B->string . '}', B);
1439 }
encaps_var(A)1440 encaps_var(A) ::= T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME(B) LBRACKET expr(C) RBRACKET RCURLY. {
1441     A = new PHP_Parser_CoreyyToken('${' . B . '[' . C->string . ']}', C);
1442 }
encaps_var(A)1443 encaps_var(A) ::= T_CURLY_OPEN variable(B) RCURLY. {
1444     A = new PHP_Parser_CoreyyToken('{' . B->string, '}', B);
1445 }
1446 
internal_functions_in_yacc(A)1447 internal_functions_in_yacc(A) ::= T_ISSET LPAREN isset_variables(B) RPAREN. {
1448     A = new PHP_Parser_CoreyyToken('isset(' . B->string . ')', B);
1449 }
internal_functions_in_yacc(A)1450 internal_functions_in_yacc(A) ::= T_EMPTY LPAREN variable(B) RPAREN. {
1451     A = new PHP_Parser_CoreyyToken('empty(' . B->string . ')', B);
1452 }
get_include_line(A)1453 get_include_line(A) ::= T_INCLUDE. {A=array($this->lex->line, $this->lex->getLastComment());}
internal_functions_in_yacc(A)1454 internal_functions_in_yacc(A) ::= get_include_line(LINE) expr(B). {
1455     A = new PHP_Parser_CoreyyToken('include ' . B->string, B);
1456     list($doc, $parsed, $line) = LINE[1];
1457     A[] = array(
1458         'type' => 'include',
1459         'file' => B->string,
1460         'line' => LINE[0],
1461         'doc' => $doc,
1462         'parseddoc' => $parsed,
1463         'docline' => $line,
1464     );
1465     $this->includes[] = array(
1466         'type' => 'include',
1467         'file' => B->string,
1468         'line' => LINE[0],
1469         'doc' => $doc,
1470         'parseddoc' => $parsed,
1471         'docline' => $line,
1472     );
1473 }
get_include_once_line(A)1474 get_include_once_line(A) ::= T_INCLUDE_ONCE. {A=$this->lex->line;}
internal_functions_in_yacc(A)1475 internal_functions_in_yacc(A) ::= get_include_once_line(LINE) expr(B). {
1476     A = new PHP_Parser_CoreyyToken('include_once ' . B->string, B);
1477     list($doc, $parsed, $line) = LINE[1];
1478     A[] = array(
1479         'type' => 'include_once',
1480         'file' => B->string,
1481         'line' => LINE[0],
1482         'doc' => $doc,
1483         'parseddoc' => $parsed,
1484         'docline' => $line,
1485     );
1486     $this->includes[] = array(
1487         'type' => 'include_once',
1488         'file' => B->string,
1489         'line' => LINE[0],
1490         'doc' => $doc,
1491         'parseddoc' => $parsed,
1492         'docline' => $line,
1493     );
1494 }
internal_functions_in_yacc(A)1495 internal_functions_in_yacc(A) ::= T_EVAL LPAREN expr(B) RPAREN. {
1496     A = new PHP_Parser_CoreyyToken('eval ' . B->string, B);
1497 }
get_require_line(A)1498 get_require_line(A) ::= T_REQUIRE. {A=array($this->lex->line, $this->lex->getLastComment());}
internal_functions_in_yacc(A)1499 internal_functions_in_yacc(A) ::= get_require_line(LINE) expr(B). {
1500     list($doc, $parsed, $line) = LINE[1];
1501     A = new PHP_Parser_CoreyyToken('require ' . B->string, B);
1502     A[] = array(
1503         'type' => 'require',
1504         'file' => B->string,
1505         'line' => LINE[0],
1506         'doc' => $doc,
1507         'parseddoc' => $parsed,
1508         'docline' => $line,
1509     );
1510     $this->includes[] = array(
1511         'type' => 'require',
1512         'file' => B->string,
1513         'line' => LINE[0],
1514         'doc' => $doc,
1515         'parseddoc' => $parsed,
1516         'docline' => $line,
1517     );
1518 }
get_require_once_line(A)1519 get_require_once_line(A) ::= T_REQUIRE_ONCE. {A=array($this->lex->line,$this->lex->getLastComment());}
internal_functions_in_yacc(A)1520 internal_functions_in_yacc(A) ::= get_require_once_line(LINE) expr(B). {
1521     list($doc, $parsed, $line) = LINE[1];
1522     A = new PHP_Parser_CoreyyToken('require_once ' . B->string, B);
1523     A[] = array(
1524         'type' => 'require_once',
1525         'file' => B->string,
1526         'line' => LINE[0],
1527         'doc' => $doc,
1528         'parseddoc' => $parsed,
1529         'docline' => $line,
1530     );
1531     $this->includes[] = array(
1532         'type' => 'require_once',
1533         'file' => B->string,
1534         'line' => LINE[0],
1535         'doc' => $doc,
1536         'parseddoc' => $parsed,
1537         'docline' => $line,
1538     );
1539 }
1540 
isset_variables(A)1541 isset_variables(A) ::= variable(B). {A = B;}
isset_variables(A)1542 isset_variables(A) ::= isset_variables(B) COMMA variable(C). {
1543     A = new PHP_Parser_CoreyyToken(B->string . ', ' . C->string, B);
1544     A[] = C;
1545 }
1546 
class_constant(A)1547 class_constant(A) ::= fully_qualified_class_name(B) T_PAAMAYIM_NEKUDOTAYIM T_STRING(C). {
1548     A = new PHP_Parser_CoreyyToken(B . '::' . C, array('usedclass' => B));
1549     A[] = array('usedclassconstant' => B . '::' . C);
1550 }
1551 
fully_qualified_class_name(A)1552 fully_qualified_class_name(A) ::= T_STRING(B). {A = B;}
1553 
function_call(A)1554 function_call(A) ::= T_STRING(B) LPAREN function_call_parameter_list(C) RPAREN. {A = new PHP_Parser_CoreyyToken(B . '(' . C->string . ')', C);}
function_call(A)1555 function_call(A) ::= fully_qualified_class_name(CLAS) T_PAAMAYIM_NEKUDOTAYIM T_STRING(FUNC) LPAREN function_call_parameter_list(PL) RPAREN. {
1556     A = new PHP_Parser_CoreyyToken(CLAS . '::' . FUNC . '(' . PL->string . ')',
1557             PL);
1558     A[] = array(
1559         'uses' => 'class',
1560         'name' => trim(CLAS),
1561     );
1562     A[] = array(
1563         'uses' => 'method',
1564         'class' => trim(CLAS),
1565         'name' => trim(FUNC),
1566     );
1567 }
function_call(A)1568 function_call(A) ::= fully_qualified_class_name(CLAS) T_PAAMAYIM_NEKUDOTAYIM variable_without_objects(V) LPAREN function_call_parameter_list(PL) RPAREN. {
1569     A = new PHP_Parser_CoreyyToken(CLAS . '::' . V->string . '(' . PL->string . ')', V);
1570     A[] = PL;
1571     A[] = array(
1572         'uses' => 'class',
1573         'name' => trim(CLAS),
1574     );
1575 }
function_call(A)1576 function_call(A) ::= variable_without_objects(B) LPAREN function_call_parameter_list(PL) RPAREN. {
1577     A = new PHP_Parser_CoreyyToken(B->string . '(' . PL->string . ')', B);
1578     A[] = PL;
1579 }
1580 
scalar(A)1581 scalar(A) ::= T_STRING(B). {A = new PHP_Parser_CoreyyToken(B);}
scalar(A)1582 scalar(A) ::= T_STRING_VARNAME(B). {A = new PHP_Parser_CoreyyToken(B);}
scalar(A)1583 scalar(A) ::= class_constant(B). {A = new PHP_Parser_CoreyyToken(B);}
scalar(A)1584 scalar(A) ::= common_scalar(B). {A = new PHP_Parser_CoreyyToken(B);}
scalar(A)1585 scalar(A) ::= DOUBLEQUOTE encaps_list(B) DOUBLEQUOTE. {
1586     A = new PHP_Parser_CoreyyToken('"' . B->string . '"', B);
1587 }
scalar(A)1588 scalar(A) ::= SINGLEQUOTE encaps_list(B) SINGLEQUOTE. {
1589     A = new PHP_Parser_CoreyyToken("'" . B->string . "'", B);
1590 }
scalar(A)1591 scalar(A) ::= T_START_HEREDOC(HERE) encaps_list(B) T_END_HEREDOC(DOC). {
1592     A = new PHP_Parser_CoreyyToken(HERE->string . B->string . DOC->string, B);
1593 }
1594 
class_name_reference(A)1595 class_name_reference(A) ::= T_STRING(B). {A = B;}
class_name_reference(A)1596 class_name_reference(A) ::= dynamic_class_name_reference(B). {A = B;}
1597 
dynamic_class_name_reference(A)1598 dynamic_class_name_reference(A) ::= base_variable(B) T_OBJECT_OPERATOR object_property(C) dynamic_class_name_variable_properties(D). {
1599     A = new PHP_Parser_CoreyyToken(B->string . '->' . C->string . D->string, B);
1600     A[] = array('usedmember' => array(B->string, C->string));
1601     A[] = D;
1602 }
dynamic_class_name_reference(A)1603 dynamic_class_name_reference(A) ::= base_variable(B). {A = B;}
1604 
dynamic_class_name_variable_properties(A)1605 dynamic_class_name_variable_properties(A) ::= dynamic_class_name_variable_properties(B) dynamic_class_name_variable_property(C). {
1606     A = B;
1607     B[] = C;
1608 }
dynamic_class_name_variable_properties(A)1609 dynamic_class_name_variable_properties(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
1610 
dynamic_class_name_variable_property(A)1611 dynamic_class_name_variable_property(A) ::= T_OBJECT_OPERATOR object_property(B). {
1612     A = new PHP_Parser_CoreyyToken('->' . B->string, array('usedmember' => B->string));
1613 }
1614 
ctor_arguments(A)1615 ctor_arguments(A) ::= LPAREN function_call_parameter_list(B) RPAREN. {
1616     A = new PHP_Parser_CoreyyToken('(' . B->string . ')', B);
1617 }
ctor_arguments(A)1618 ctor_arguments(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
1619 
possible_comma(A)1620 possible_comma(A) ::= COMMA. {A = ',';}
possible_comma(A)1621 possible_comma(A) ::= . {A = '';}
1622 
for_expr(A)1623 for_expr(A) ::= non_empty_for_expr(B). {A = B;}
for_expr(A)1624 for_expr(A) ::= . {A = new PHP_Parser_CoreyyToken('');}
1625 
non_empty_for_expr(A)1626 non_empty_for_expr(A) ::= non_empty_for_expr(B) COMMA expr(C). {
1627     A = new PHP_Parser_CoreyyToken(B->string . ', ' . C->string, B);
1628     A[] = C;
1629 }
non_empty_for_expr(A)1630 non_empty_for_expr(A) ::= expr(B). {A = B;}
1631 
is_reference(A)1632 is_reference(A) ::= AMPERSAND. {A = true;}
is_reference(A)1633 is_reference(A) ::= . {A = false;}