microsoft / microsoft/tolerant-php-parser
Better disambiguation between subscript-expression and compound-statement
Nobody has claimed this yet.
- Dominant language
- PHP
- Stars
- 894
- Forks
- 85
- Avg merge
- 2d 13h
- Merged PRs (30d)
- 3
Description
This error tolerance case needs some special handling.
class A {
function b() {
if ($expression {
$a = 3;
$b = "hello";
}
echo "hi";
}
public function c() {
}
}
In this case, the if statement is missing a close paren. However, rather than getting parsed as an if-statement missing a close paren, it gets parsed as a subscript-expression (which is defined as follows, according to the PHP language spec.
subscript-expression:
dereferencable-expression [ expressionopt ]
dereferencable-expression { expression } <b>[Deprecated form]</b>
This results in the first close brace getting treated as a close brace for the method, rather than the if statement. Then the next close brace gets eaten by the Class node (which terminates the class), so c() ends up being a function, rather than a method.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Reproduce the PHP snippet and inspect the parser rules or entry points handling subscript-expression, if statements, and compound statements. Confirm the corrected parse keeps the missing-parenthesis error associated with the if statement and preserves c() as a method of class A.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- php
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100