mirror of
https://github.com/danog/PHP-Parser.git
synced 2024-12-02 09:17:58 +01:00
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.
This commit is contained in:
parent
14454326e9
commit
ff10cc9d08
@ -206,6 +206,8 @@ Component documentation:
|
|||||||
* [Constant expression evaluation](component/Constant_expression_evaluation.markdown)
|
* [Constant expression evaluation](component/Constant_expression_evaluation.markdown)
|
||||||
* Evaluating constant/property/etc initializers
|
* Evaluating constant/property/etc initializers
|
||||||
* Handling errors and unsupported expressions
|
* Handling errors and unsupported expressions
|
||||||
|
* [JSON representation](component/JSON_representation.markdown)
|
||||||
|
* JSON encoding and decoding of ASTs
|
||||||
* [Performance](doc/component/Performance.markdown)
|
* [Performance](doc/component/Performance.markdown)
|
||||||
* Disabling XDebug
|
* Disabling XDebug
|
||||||
* Reusing objects
|
* Reusing objects
|
||||||
|
@ -81,6 +81,9 @@ foreach ($files as $file) {
|
|||||||
} elseif ('pretty-print' === $operation) {
|
} elseif ('pretty-print' === $operation) {
|
||||||
echo "==> Pretty print:\n";
|
echo "==> Pretty print:\n";
|
||||||
echo $prettyPrinter->prettyPrintFile($stmts), "\n";
|
echo $prettyPrinter->prettyPrintFile($stmts), "\n";
|
||||||
|
} elseif ('json-dump' === $operation) {
|
||||||
|
echo "==> JSON dump:\n";
|
||||||
|
echo json_encode($stmts, JSON_PRETTY_PRINT), "\n";
|
||||||
} elseif ('var-dump' === $operation) {
|
} elseif ('var-dump' === $operation) {
|
||||||
echo "==> var_dump():\n";
|
echo "==> var_dump():\n";
|
||||||
var_dump($stmts);
|
var_dump($stmts);
|
||||||
@ -112,6 +115,7 @@ Operations is a list of the following options (--dump by default):
|
|||||||
|
|
||||||
-d, --dump Dump nodes using NodeDumper
|
-d, --dump Dump nodes using NodeDumper
|
||||||
-p, --pretty-print Pretty print file using PrettyPrinter\Standard
|
-p, --pretty-print Pretty print file using PrettyPrinter\Standard
|
||||||
|
-j, --json-dump Print json_encode() result
|
||||||
--var-dump var_dump() nodes (for exact structure)
|
--var-dump var_dump() nodes (for exact structure)
|
||||||
-N, --resolve-names Resolve names using NodeVisitor\NameResolver
|
-N, --resolve-names Resolve names using NodeVisitor\NameResolver
|
||||||
-c, --with-column-info Show column-numbers for errors (if available)
|
-c, --with-column-info Show column-numbers for errors (if available)
|
||||||
@ -155,8 +159,9 @@ function parseArgs($args) {
|
|||||||
case '-p':
|
case '-p':
|
||||||
$operations[] = 'pretty-print';
|
$operations[] = 'pretty-print';
|
||||||
break;
|
break;
|
||||||
case '--serialize-xml':
|
case '--json-dump':
|
||||||
$operations[] = 'serialize-xml';
|
case '-j':
|
||||||
|
$operations[] = 'json-dump';
|
||||||
break;
|
break;
|
||||||
case '--var-dump':
|
case '--var-dump':
|
||||||
$operations[] = 'var-dump';
|
$operations[] = 'var-dump';
|
||||||
|
@ -89,140 +89,4 @@ array(
|
|||||||
JSON encoding
|
JSON encoding
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
Nodes (and comments) implement the `JsonSerializable` interface. As such, it is possible to JSON
|
See [JSON representation](component/JSON_representation.markdown) section.
|
||||||
encode the AST directly using `json_encode()`:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$code = <<<'CODE'
|
|
||||||
<?php
|
|
||||||
|
|
||||||
function printLine($msg) {
|
|
||||||
echo $msg, "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
printLine('Hello World!!!');
|
|
||||||
CODE;
|
|
||||||
|
|
||||||
$parser = (new PhpParser\ParserFactory)->create(PhpParser\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": "printLine",
|
|
||||||
"params": [
|
|
||||||
{
|
|
||||||
"nodeType": "Param",
|
|
||||||
"type": null,
|
|
||||||
"byRef": false,
|
|
||||||
"variadic": false,
|
|
||||||
"name": "msg",
|
|
||||||
"default": null,
|
|
||||||
"attributes": {
|
|
||||||
"startLine": 3,
|
|
||||||
"endLine": 3
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"returnType": null,
|
|
||||||
"stmts": [
|
|
||||||
{
|
|
||||||
"nodeType": "Stmt_Echo",
|
|
||||||
"exprs": [
|
|
||||||
{
|
|
||||||
"nodeType": "Expr_Variable",
|
|
||||||
"name": "msg",
|
|
||||||
"attributes": {
|
|
||||||
"startLine": 4,
|
|
||||||
"endLine": 4
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"nodeType": "Scalar_String",
|
|
||||||
"value": "\n",
|
|
||||||
"attributes": {
|
|
||||||
"startLine": 4,
|
|
||||||
"endLine": 4,
|
|
||||||
"kind": 2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"attributes": {
|
|
||||||
"startLine": 4,
|
|
||||||
"endLine": 4
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"attributes": {
|
|
||||||
"startLine": 3,
|
|
||||||
"endLine": 5
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"nodeType": "Expr_FuncCall",
|
|
||||||
"name": {
|
|
||||||
"nodeType": "Name",
|
|
||||||
"parts": [
|
|
||||||
"printLine"
|
|
||||||
],
|
|
||||||
"attributes": {
|
|
||||||
"startLine": 7,
|
|
||||||
"endLine": 7
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [
|
|
||||||
{
|
|
||||||
"nodeType": "Arg",
|
|
||||||
"value": {
|
|
||||||
"nodeType": "Scalar_String",
|
|
||||||
"value": "Hello World!!!",
|
|
||||||
"attributes": {
|
|
||||||
"startLine": 7,
|
|
||||||
"endLine": 7,
|
|
||||||
"kind": 1
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"byRef": false,
|
|
||||||
"unpack": false,
|
|
||||||
"attributes": {
|
|
||||||
"startLine": 7,
|
|
||||||
"endLine": 7
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"attributes": {
|
|
||||||
"startLine": 7,
|
|
||||||
"endLine": 7
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
The JSON representation may be converted back into a node tree 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.
|
|
@ -30,6 +30,8 @@ Component documentation
|
|||||||
* [Constant expression evaluation](component/Constant_expression_evaluation.markdown)
|
* [Constant expression evaluation](component/Constant_expression_evaluation.markdown)
|
||||||
* Evaluating constant/property/etc initializers
|
* Evaluating constant/property/etc initializers
|
||||||
* Handling errors and unsupported expressions
|
* Handling errors and unsupported expressions
|
||||||
|
* [JSON representation](component/JSON_representation.markdown)
|
||||||
|
* JSON encoding and decoding of ASTs
|
||||||
* [Performance](component/Performance.markdown)
|
* [Performance](component/Performance.markdown)
|
||||||
* Disabling XDebug
|
* Disabling XDebug
|
||||||
* Reusing objects
|
* Reusing objects
|
||||||
|
131
doc/component/JSON_representation.markdown
Normal file
131
doc/component/JSON_representation.markdown
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
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`.
|
Loading…
Reference in New Issue
Block a user