mirror of
https://github.com/RGBCube/serenity
synced 2025-10-24 19:22:35 +00:00
Instead of passing the continuously merged initial forbidden token set
(with the new additional forbidden tokens from each parsed secondary
expression) to the next call of parse_secondary_expression(), keep a
copy of the original set and use it as the base for parsing the next
secondary expression.
This bug prevented us from properly parsing the following expression:
```js
0 ?? 0 ? 0 : 0 || 0
```
...due to LogicalExpression with LogicalOp::NullishCoalescing returning
both DoubleAmpersand and DoublePipe in its forbidden token set.
The following correct AST is now generated:
Program
(Children)
ExpressionStatement
ConditionalExpression
(Test)
LogicalExpression
NumericLiteral 0
??
NumericLiteral 0
(Consequent)
NumericLiteral 0
(Alternate)
LogicalExpression
NumericLiteral 0
||
NumericLiteral 0
An alternate solution I explored was only merging the original forbidden
token set with the one of the last parsed secondary expression which is
then passed to match_secondary_expression(); however that led to an
incorrect AST (note the alternate expression):
Program
(Children)
ExpressionStatement
LogicalExpression
ConditionalExpression
(Test)
LogicalExpression
NumericLiteral 0
??
NumericLiteral 0
(Consequent)
NumericLiteral 0
(Alternate)
NumericLiteral 0
||
NumericLiteral 0
Truth be told, I don't know enough about the inner workings of the
parser to fully explain the difference. AFAICT this patch has no
unintended side effects in its current form though.
Fixes #18087.
|
||
|---|---|---|
| .. | ||
| Bytecode | ||
| Contrib/Test262 | ||
| Heap | ||
| Runtime | ||
| Tests | ||
| AST.cpp | ||
| AST.h | ||
| CMakeLists.txt | ||
| Console.cpp | ||
| Console.h | ||
| CyclicModule.cpp | ||
| CyclicModule.h | ||
| Forward.h | ||
| Interpreter.cpp | ||
| Interpreter.h | ||
| Lexer.cpp | ||
| Lexer.h | ||
| MarkupGenerator.cpp | ||
| MarkupGenerator.h | ||
| Module.cpp | ||
| Module.h | ||
| Parser.cpp | ||
| Parser.h | ||
| ParserError.cpp | ||
| ParserError.h | ||
| Print.cpp | ||
| Print.h | ||
| SafeFunction.h | ||
| Script.cpp | ||
| Script.h | ||
| SourceCode.cpp | ||
| SourceCode.h | ||
| SourceRange.h | ||
| SourceTextModule.cpp | ||
| SourceTextModule.h | ||
| SyntaxHighlighter.cpp | ||
| SyntaxHighlighter.h | ||
| SyntheticModule.cpp | ||
| SyntheticModule.h | ||
| Token.cpp | ||
| Token.h | ||