1

I'm using PHP-Parser to parse PHP codes, and get the AST in Json format. I want to ask how to get the results without Attributes ( startLine, endLine, comment etc.)

1 Answer 1

1
+50

Although very expensive computationally, you could traverse the output recursively and remove these attributes.

OR

An alternative approach and maybe easier would be to extend one of the implemented Php Parser classes and override protected function createCommentNopAttributes(array $comments) to return your desired attributes or in this case none.

For example, say we intend to parse Php7 code we could create our own custom parser


class MyCustomPhp7Parser extends \PhpParser\Parser\Php7 {
   //no need to implement the other methods as we are inheriting from a concrete class
   
   //override method inherited from https://github.com/nikic/PHP-Parser/blob/master/lib/PhpParser/ParserAbstract.php
   protected function createCommentNopAttributes(array $comments) {
       $attributes = ['comments' => []]; //return data as desired
       return $attributes;
   }
} 

You can then use your custom parser implementation

<?php

use PhpParser\ParserFactory;

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

/** @param string $msg */
function printLine($msg) {
    echo $msg, "\n";
}
CODE;

$parser = new MyCustomPhp7Parser(
   new \PhpParser\Lexer\Emulative(), //desired lexer
   [] //additional options
);

try {
    $stmts = $parser->parse($code);

    echo json_encode($stmts, JSON_PRETTY_PRINT), "\n";
} catch (PhpParser\Error $e) {
    echo 'Parse Error: ', $e->getMessage();
}

To retrieve

[
    {
        "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": {
            "comments": [
                
            ],
   
        }
    }
]
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.