php-parser/doc/component/JSON_representation.markdown
Nikita Popov ff10cc9d08 Move JSON representation into component documentation
Also add -j flag to php-parse script to get a JSON dump. Also
drop obsolete flag for XML dumping.
2018-02-08 16:36:04 +01:00

3.4 KiB

JSON representation

Nodes (and comments) implement the JsonSerializable interface. As such, it is possible to JSON encode the AST directly using json_encode():

<?php

use PhpParser\ParserFactory;

$code = <<<'CODE'
<?php

/** @param string $msg */
function printLine($msg) {
    echo $msg, "\n";
}
CODE;

$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);

try {
    $stmts = $parser->parse($code);

    echo json_encode($stmts, JSON_PRETTY_PRINT), "\n";
} catch (PhpParser\Error $e) {
    echo 'Parse Error: ', $e->getMessage();
}

This will result in the following output (which includes attributes):

[
    {
        "nodeType": "Stmt_Function",
        "byRef": false,
        "name": {
            "nodeType": "Identifier",
            "name": "printLine",
            "attributes": {
                "startLine": 4,
                "endLine": 4
            }
        },
        "params": [
            {
                "nodeType": "Param",
                "type": null,
                "byRef": false,
                "variadic": false,
                "var": {
                    "nodeType": "Expr_Variable",
                    "name": "msg",
                    "attributes": {
                        "startLine": 4,
                        "endLine": 4
                    }
                },
                "default": null,
                "attributes": {
                    "startLine": 4,
                    "endLine": 4
                }
            }
        ],
        "returnType": null,
        "stmts": [
            {
                "nodeType": "Stmt_Echo",
                "exprs": [
                    {
                        "nodeType": "Expr_Variable",
                        "name": "msg",
                        "attributes": {
                            "startLine": 5,
                            "endLine": 5
                        }
                    },
                    {
                        "nodeType": "Scalar_String",
                        "value": "\n",
                        "attributes": {
                            "startLine": 5,
                            "endLine": 5,
                            "kind": 2
                        }
                    }
                ],
                "attributes": {
                    "startLine": 5,
                    "endLine": 5
                }
            }
        ],
        "attributes": {
            "startLine": 4,
            "comments": [
                {
                    "nodeType": "Comment_Doc",
                    "text": "\/** @param string $msg *\/",
                    "line": 3,
                    "filePos": 9,
                    "tokenPos": 2
                }
            ],
            "endLine": 6
        }
    }
]

The JSON representation may be converted back into an AST using the JsonDecoder:

<?php

$nodeDecoder = new PhpParser\NodeDecoder();
$ast = $nodeDecoder->decode($json);

Note that not all ASTs can be represented using JSON. In particular:

  • JSON only supports UTF-8 strings.
  • JSON does not support non-finite floating-point numbers. This can occur if the original source code contains non-representable floating-pointing literals such as 1e1000.

If the node tree is not representable in JSON, the initial json_encode() call will fail.

From the command line, a JSON dump can be obtained using vendor/bin/php-parse -j file.php.