glayzzle / php-parser

:herb: NodeJS PHP Parser - extract AST or tokens
https://php-parser.glayzzle.com/
BSD 3-Clause "New" or "Revised" License
537 stars 71 forks source link

Unexpected syntax error when nullsafe object operator used with parentheses #1127

Open shufo opened 1 year ago

shufo commented 1 year ago

Context

Problems

When php code like ($value ?: null)?->someProperty; passed to parser, it throws unexpected Syntax exception.

 $  node
Welcome to Node.js v16.16.0.
Type ".help" for more information.
> const parser = require('php-parser')
undefined
> const target = `($value ?: null)?->someProperty;`;
undefined
> const eval = parser.parseEval(target)
Uncaught:
[SyntaxError: Parse Error : syntax error, unexpected '?->' (T_NULLSAFE_OBJECT_OPERATOR), expecting ';' on line 1
] {
  lineNumber: 1,
  fileName: 'eval',
  columnNumber: 16
}

But its syntax is valid in php.

 $  php -v
PHP 8.1.2-1ubuntu2.10 (cli) (built: Jan 16 2023 15:19:49) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.2-1ubuntu2.10, Copyright (c), by Zend Technologies

 $  cat test.php
<?php
echo ($value ?: null)?->someProperty;

 $  php --syntax-check test.php
No syntax errors detected in test.php

Repro:

test.js

const parser = require(".");
const target = `($value ?: null)?->someProperty;`;
const eval = parser.parseEval(target);
$ node test.js