php-parser/grammar
nikic cdbad02fb2 Fix endAttributes assignment
The end attributes previously were always assigned from the last read token,
which does not necessarily correspond to the last token in the reduced rule.
In particular this occurs if the parser read a new token and based on that
lookahead decided to reduce a rule. The behavior was only correct if the
newly read token was first shifted and then the rule was reduced.

This is fixed by buffering the endAttributes of the new token in a temporary
variable and only assigning them once the token is shifted.
2012-11-20 16:12:19 +01:00
..
analyze.php Remove node analysis from analyze.php and fix some other things about it 2011-08-14 15:52:57 +02:00
kmyacc.php.parser Fix endAttributes assignment 2012-11-20 16:12:19 +01:00
README.md Turn rebuildParser.php into a CLI script 2012-10-19 19:11:47 +02:00
rebuildParser.php Turn rebuildParser.php into a CLI script 2012-10-19 19:11:47 +02:00
zend_language_parser.phpy Scalar_String::create() -> Scalar_String::parse() 2012-10-19 15:17:08 +02:00

What do all those files mean?

  • zend_language_parser.y: Original PHP grammer this parser is based on
  • zend_language_parser.phpy: PHP grammer written in a pseudo language
  • analyze.php: Analyzes the .phpy-grammer and outputs some info about it
  • rebuildParser.php: Preprocesses the .phpy-grammar and builds the parser using kmyacc
  • kmyacc.php.parser: A kmyacc parser prototype file for PHP

.phpy pseudo language

The .phpy file is a normal grammer in kmyacc (yacc) style, with some transformations applied to it:

  • Nodes are created using the syntax Name[..., ...]. This is transformed into new PHPParser_Node_Name(..., ..., $attributes)
  • Name::abc is transformed to PHPParser_Node_Name::abc
  • Some function-like constructs are resolved (see rebuildParser.php for a list)
  • Associative arrays are written as [key: value, ...], which is transformed to array('key' => value, ...)

Building the parser

In order to rebuild the parser, you need moriyoshi's fork of kmyacc. After you compiled/installed it, run the rebuildParser.php script.

By default only the Parser.php is built. If you want to build the Parser/Debug.php and the y.output run the script with --debug. If you want to retain the preprocessed grammar pass --keep-tmp-grammar.