mirror of
https://github.com/RGBCube/serenity
synced 2025-05-21 07:45:08 +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 |