microsoft / microsoft/tolerant-php-parser

Better disambiguation between subscript-expression and compound-statement

Open
#18 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug error-handling up-for-grabs
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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.