как преобразовать AST (Json формат) из PHP -Parser в график управления потоком - PullRequest
0 голосов
/ 15 апреля 2020

Я использую PHP -Parser для построения абстрактного синтаксического дерева исходного кода PHP. и затем получите результаты в формате JSON. Например:

(код)

use PhpParser\ParserFactory;

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

$a = $_POST['first'];
$b = $_POST['second'];

if( $a  > $b )
{
    echo $a;
}
else
{
    echo $b;
} 
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();
}

Результат этого синтаксического анализатора Json:

[ { "nodeType": "Stmt_Expression", "expr": { "nodeType": "Expr_Assign", "var": { "nodeType": "Expr_Variable", "name": "a", "attributes": { "startLine": 3, "endLine": 3 } }, "expr": { "nodeType": "Expr_ArrayDimFetch", "var": { "nodeType": "Expr_Variable", "name": "_POST", "attributes": { "startLine": 3, "endLine": 3 } }, "dim": { "nodeType": "Scalar_String", "value": "first", "attributes": { "startLine": 3, "endLine": 3, "kind": 1 } }, "attributes": { "startLine": 3, "endLine": 3 } }, "attributes": { "startLine": 3, "endLine": 3 } }, "attributes": { "startLine": 3, "endLine": 3 } }, { "nodeType": "Stmt_Expression", "expr": { "nodeType": "Expr_Assign", "var": { "nodeType": "Expr_Variable", "name": "b", "attributes": { "startLine": 4, "endLine": 4 } }, "expr": { "nodeType": "Expr_ArrayDimFetch", "var": { "nodeType": "Expr_Variable", "name": "_POST", "attributes": { "startLine": 4, "endLine": 4 } }, "dim": { "nodeType": "Scalar_String", "value": "second", "attributes": { "startLine": 4, "endLine": 4, "kind": 1 } }, "attributes": { "startLine": 4, "endLine": 4 } }, "attributes": { "startLine": 4, "endLine": 4 } }, "attributes": { "startLine": 4, "endLine": 4 } }, { "nodeType": "Stmt_If", "cond": { "nodeType": "Expr_BinaryOp_Greater", "left": { "nodeType": "Expr_Variable", "name": "a", "attributes": { "startLine": 6, "endLine": 6 } }, "right": { "nodeType": "Expr_Variable", "name": "b", "attributes": { "startLine": 6, "endLine": 6 } }, "attributes": { "startLine": 6, "endLine": 6 } }, "stmts": [ { "nodeType": "Stmt_Echo", "exprs": [ { "nodeType": "Expr_Variable", "name": "a", "attributes": { "startLine": 8, "endLine": 8 } } ], "attributes": { "startLine": 8, "endLine": 8 } } ], "elseifs": [], "else": { "nodeType": "Stmt_Else", "stmts": [ { "nodeType": "Stmt_Echo", "exprs": [ { "nodeType": "Expr_Variable", "name": "b", "attributes": { "startLine": 12, "endLine": 12 } } ], "attributes": { "startLine": 12, "endLine": 12 } } ], "attributes": { "startLine": 10, "endLine": 13 } }, "attributes": { "startLine": 6, "endLine": 13 } } ]

Как преобразовать этот формат JSON в элемент управления Flow Graph.

  1. Существует ли библиотека с открытым исходным кодом для этого? Так я могу go через узлы и проверить их?
  2. Существует ли какой-либо веб-сайт, показывающий график потока управления, можно ли определить поток программы?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...