mirror of
https://github.com/danog/PHP-Parser.git
synced 2024-11-26 20:04:48 +01:00
131 lines
3.4 KiB
Markdown
131 lines
3.4 KiB
Markdown
|
JSON representation
|
||
|
===================
|
||
|
|
||
|
Nodes (and comments) implement the `JsonSerializable` interface. As such, it is possible to JSON
|
||
|
encode the AST directly using `json_encode()`:
|
||
|
|
||
|
```php
|
||
|
<?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):
|
||
|
|
||
|
```json
|
||
|
[
|
||
|
{
|
||
|
"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
|
||
|
<?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`.
|