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;}