第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在 AST 中獲取變量名和值

如何在 AST 中獲取變量名和值

PHP
茅侃侃 2022-12-11 09:33:59
我正在使用PHP-PARser來查找 PHP 程序的 AST。例如:代碼<?phpuse PhpParser\Error;use PhpParser\NodeDumper;use PhpParser\ParserFactory;$code = <<<'CODE'<?php$variable = $_POST['first'];$new = $nonexist; CODE;$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);try {    $ast = $parser->parse($code);} catch (Error $error) {    echo "Parse error: {$error->getMessage()}\n";    return;}$dumper = new NodeDumper;echo $dumper->dump($ast) . "\n";上面例子的AST結(jié)果如下:array( 0: Stmt_Expression( expr: Expr_Assign( var: Expr_Variable( name: variable ) expr: Expr_ArrayDimFetch( var: Expr_Variable( name: _POST_first_symbol ) dim: Scalar_String( value: first ) ) ) ) 1: Stmt_Expression( expr: Expr_Assign( var: Expr_Variable( name: new ) expr: Expr_Variable( name: nonexist ) ) ) )我要查找的是variable = _POSTANDnew = nonexist 我使用leavenode函數(shù)來達(dá)到_POSTand variable。我要查找的代碼_POST如下variable:public function leaveNode(Node $node)    {        $collect_to_print= array();        if ($node instanceof ArrayDimFetch            && $node->var instanceof Variable            && $node->var->name === '_POST')        {            $variableName = (string) $node->var->name;            $collect_to_print[$node->dim->value] = $node->var->name; // will store the variables in array in a way to print them all later such as variable => _POST , how to get the name `variable` in this case            return $node;        }        else            if ($node instanceof Variable        && !($node->var->name === '_POST' ))        {            $collect_to_print[$node->name] = 'Empty' ;        }    }到目前為止,我的結(jié)果在單獨(dú)的行中顯示每個(gè)變量,如下所示:variable => first => _POST  // This _POST should be the value of variable (above)new => Emptynonexist => Empty但是,我希望結(jié)果是:variable => _POSTnew => Emptynonexist => Empty請幫忙
查看完整描述

1 回答

?
慕絲7291255

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊

這比您提出的其他問題要復(fù)雜得多,但是了解如何編寫它很有趣。


我已經(jīng)在代碼中添加了注釋,但基本上它會(huì)分析代碼并查找分配(PhpParser\Node\Expr\Assign節(jié)點(diǎn)實(shí)例)。然后它將它分成左右兩部分,并遞歸地提取兩部分中的任何變量。


該代碼允許在表達(dá)式的任一側(cè)嵌套變量,我更改了示例代碼以提供一些更廣泛的示例。


代碼中的注釋(假定了解解析器如何與節(jié)點(diǎn)等一起工作)...


$traverser = new NodeTraverser;


class ExtractVars extends NodeVisitorAbstract {

    private $prettyPrinter = null;


    private $variables = [];

    private $expressions = [];


    public function __construct() {

        $this->prettyPrinter = new PhpParser\PrettyPrinter\Standard;

    }


    public function leaveNode(Node $node) {

        if ( $node instanceof PhpParser\Node\Expr\Assign  ) {

                $assignVars = $this->extractVarRefs ( $node->var );

                // Get string of what assigned to actually is

                $assign = $this->prettyPrinter->prettyPrintExpr($node->var);

                // Store the variables associated with the left hand side

                $this->expressions[$assign]["to"] = $assignVars;

                // Store variables from right

                $this->expressions[$assign][] = $this->extractVarRefs ( $node->expr );

         }

    }


    private function extractVarRefs ( Node $node ) : array  {

        $variableList = [];

        // If it's a variable, store the name

        if ( $node instanceof PhpParser\Node\Expr\Variable )   {

            $variable = $this->prettyPrinter->prettyPrintExpr($node);

            $this->variables[] = $variable;

            $variableList[] = $variable;

        }

        // Look for any further variables in the node

        foreach ( $node->getSubNodeNames() as $newNodeName )   {

            $newNode = $node->$newNodeName;

            if ( $newNode instanceof Node && $newNode->getSubNodeNames())   {

                // Recursive call to extract variables

                $toAdd = $this->extractVarRefs ( $newNode );

                // Add new list to current list

                $variableList = array_merge($variableList, $toAdd);

            }

        }

        return $variableList;

    }


    public function getVariables() : array  {

        return array_unique($this->variables);

    }


    public function getExpressions() : array    {

        return $this->expressions;

    }


}


$varExtract = new ExtractVars();

$traverser->addVisitor ($varExtract);


$traverser->traverse($ast);


print_r($varExtract->getVariables());


print_r($varExtract->getExpressions());

其中給出了變量列表...


Array

(

    [0] => $_POST

    [1] => $b

    [3] => $new

    [4] => $nonexist

)

表達(dá)式列表為


Array

(

    [$_POST[$b]] => Array

        (

            [to] => Array

                (

                    [0] => $_POST

                    [1] => $b

                )


            [0] => Array

                (

                    [0] => $_POST

                )


        )


    [$new] => Array

        (

            [to] => Array

                (

                    [0] => $new

                )


            [0] => Array

                (

                    [0] => $nonexist

                )


            [1] => Array

                (

                    [0] => $_POST

                    [1] => $b

                )


        )


)

請注意,[to]數(shù)組的元素包含 . 左側(cè)涉及的所有變量=。


查看完整回答
反對 回復(fù) 2022-12-11
  • 1 回答
  • 0 關(guān)注
  • 182 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)