Я использую 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.
- Существует ли библиотека с открытым исходным кодом для этого? Так я могу go через узлы и проверить их?
- Существует ли какой-либо веб-сайт, показывающий график потока управления, можно ли определить поток программы?