A PHP parser written in PHP
Go to file
Nikita Popov 17d1e738fa Don't use ~__EMU sequences in emulative lexer
These were necessary back in the day when we had to emulate some
complex functionality such as nowdoc strings. Now we can simply
directly translate certain token sequences.

The motivation for this change is to avoid preprocessing of the source
code, which would complicate offset-aware error handling inside the
lexer as offsets would no longer be correct.
2016-09-30 19:10:16 +02:00
bin Add Error::getMessageWithColumnInfo() 2016-09-30 18:24:43 +02:00
doc Update some PHP version numbers 2016-07-22 17:07:56 +02:00
grammar Merge branch '2.x' 2016-08-30 22:38:34 +02:00
lib Don't use ~__EMU sequences in emulative lexer 2016-09-30 19:10:16 +02:00
test Remove Error::(get|set)RawLine() 2016-09-30 18:30:01 +02:00
test_old Run test_old using php -n 2016-04-10 21:09:02 +09:00
.gitignore Use composer PSR-4 autoloader 2015-09-16 22:02:00 +09:00
.travis.yml Remove support for PHP 5.4 2016-07-05 22:29:41 +02:00
CHANGELOG.md Add NodeAbstract::setDocComment() 2016-09-17 20:51:22 +02:00
composer.json Use phpunit 5 if we can rather than 4 (#301) 2016-09-16 17:41:21 +02:00
LICENSE fix typos 2011-06-26 18:45:19 +02:00
phpunit.xml.dist Split parsing tests into code tests and other stuff 2015-06-20 11:44:29 +02:00
README.md Update some PHP version numbers 2016-07-22 17:07:56 +02:00
UPGRADE-1.0.md Fix typos 2014-09-12 14:44:32 +02:00
UPGRADE-2.0.md Release PHP-Parser 2.0.0 2015-12-04 16:28:43 +01:00
UPGRADE-3.0.md Add upgrading information 2016-07-25 15:09:21 +02:00

PHP Parser

Build Status Coverage Status

This is a PHP 5.2 to PHP 7.1 parser written in PHP. Its purpose is to simplify static code analysis and manipulation.

Documentation for version 2.x (stable; for running on PHP >= 5.4; for parsing PHP 5.2 to PHP 7.0).

Documentation for version 1.x (unsupported; for running on PHP >= 5.3; for parsing PHP 5.2 to PHP 5.6).

In a Nutshell

The parser turns PHP source code into an abstract syntax tree. For example, if you pass the following code into the parser:

<?php
echo 'Hi', 'World';
hello\world('foo', 'bar' . 'baz');

You'll get a syntax tree looking roughly like this:

array(
    0: Stmt_Echo(
        exprs: array(
            0: Scalar_String(
                value: Hi
            )
            1: Scalar_String(
                value: World
            )
        )
    )
    1: Expr_FuncCall(
        name: Name(
            parts: array(
                0: hello
                1: world
            )
        )
        args: array(
            0: Arg(
                value: Scalar_String(
                    value: foo
                )
                byRef: false
            )
            1: Arg(
                value: Expr_Concat(
                    left: Scalar_String(
                        value: bar
                    )
                    right: Scalar_String(
                        value: baz
                    )
                )
                byRef: false
            )
        )
    )
)

You can then work with this syntax tree, for example to statically analyze the code (e.g. to find programming errors or security issues).

Additionally, you can convert a syntax tree back to PHP code. This allows you to do code preprocessing (like automatedly porting code to older PHP versions).

Installation

The preferred installation method is composer:

php composer.phar require nikic/php-parser

Documentation

  1. Introduction
  2. Usage of basic components
  3. Other node tree representations
  4. Code generation

Component documentation:

  1. Error
  2. Lexer