1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 11:38:11 +00:00

LibJS: Add operator precedence parsing

Obey precedence and associativity rules when parsing expressions
with chained operators.
This commit is contained in:
Stephan Unverwerth 2020-03-12 23:02:41 +01:00 committed by Andreas Kling
parent f347dd5c5e
commit 15d5b2d29e
8 changed files with 281 additions and 53 deletions

View file

@ -25,6 +25,7 @@
*/
#include "Token.h"
#include <AK/Assertions.h>
namespace JS {
@ -37,14 +38,20 @@ const char* Token::name(TokenType type)
return "AmpersandEquals";
case TokenType::Asterisk:
return "Asterisk";
case TokenType::AsteriskAsteriskEquals:
return "AsteriskAsteriskEquals";
case TokenType::AsteriskEquals:
return "AsteriskEquals";
case TokenType::Await:
return "Await";
case TokenType::BoolLiteral:
return "BoolLiteral";
case TokenType::BracketOpen:
return "BracketOpen";
case TokenType::BracketClose:
return "BracketClose";
case TokenType::Caret:
return "Caret";
case TokenType::Catch:
return "Catch";
case TokenType::Class:
@ -63,8 +70,12 @@ const char* Token::name(TokenType type)
return "Do";
case TokenType::DoubleAmpersand:
return "DoubleAmpersand";
case TokenType::DoubleAsterisk:
return "DoubleAsterisk";
case TokenType::DoublePipe:
return "DoublePipe";
case TokenType::DoubleQuestionMark:
return "DoubleQuestionMark";
case TokenType::Else:
return "Else";
case TokenType::Eof:
@ -77,6 +88,8 @@ const char* Token::name(TokenType type)
return "ExclamationMark";
case TokenType::ExclamationMarkEquals:
return "ExclamationMarkEquals";
case TokenType::ExclamationMarkEqualsEquals:
return "ExclamationMarkEqualsEquals";
case TokenType::Finally:
return "Finally";
case TokenType::Function:
@ -87,6 +100,10 @@ const char* Token::name(TokenType type)
return "Identifier";
case TokenType::If:
return "If";
case TokenType::In:
return "In";
case TokenType::Instanceof:
return "Instanceof";
case TokenType::Interface:
return "Interface";
case TokenType::Invalid:
@ -129,6 +146,8 @@ const char* Token::name(TokenType type)
return "PlusPlus";
case TokenType::QuestionMark:
return "QuestionMark";
case TokenType::QuestionMarkPeriod:
return "QuestionMarkPeriod";
case TokenType::RegexLiteral:
return "RegexLiteral";
case TokenType::Return:
@ -137,21 +156,38 @@ const char* Token::name(TokenType type)
return "Semicolon";
case TokenType::ShiftLeft:
return "ShiftLeft";
case TokenType::ShiftLeftEquals:
return "ShiftLeftEquals";
case TokenType::ShiftRight:
return "ShiftRight";
case TokenType::ShiftRightEquals:
return "ShiftRightEquals";
case TokenType::Slash:
return "Slash";
case TokenType::SlashEquals:
return "SlashEquals";
case TokenType::StringLiteral:
return "StringLiteral";
case TokenType::Tilde:
return "Tilde";
case TokenType::Try:
return "Try";
case TokenType::Typeof:
return "Typeof";
case TokenType::UnsignedShiftRight:
return "UnsignedShiftRight";
case TokenType::UnsignedShiftRightEquals:
return "UnsignedShiftRightEquals";
case TokenType::Var:
return "Var";
case TokenType::Void:
return "Void";
case TokenType::While:
return "While";
case TokenType::Yield:
return "Yield";
default:
ASSERT_NOT_REACHED();
return "<Unknown>";
}
}