1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-10 00:17:36 +00:00

LibJS: Use some macro magic to avoid duplicating all the token types

This commit is contained in:
Andreas Kling 2020-03-30 13:11:07 +02:00
parent f221771717
commit a1c718e387
2 changed files with 99 additions and 265 deletions

View file

@ -33,182 +33,11 @@ namespace JS {
const char* Token::name(TokenType type)
{
switch (type) {
case TokenType::Ampersand:
return "Ampersand";
case TokenType::AmpersandEquals:
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::Break:
return "Break";
case TokenType::Caret:
return "Caret";
case TokenType::Case:
return "Case";
case TokenType::Catch:
return "Catch";
case TokenType::Class:
return "Class";
case TokenType::Colon:
return "Colon";
case TokenType::Comma:
return "Comma";
case TokenType::Const:
return "Const";
case TokenType::CurlyClose:
return "CurlyClose";
case TokenType::CurlyOpen:
return "CurlyOpen";
case TokenType::Default:
return "Default";
case TokenType::Delete:
return "Delete";
case TokenType::Do:
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:
return "Eof";
case TokenType::Equals:
return "Equals";
case TokenType::EqualsEquals:
return "EqualsEquals";
case TokenType::EqualsEqualsEquals:
return "EqualsEqualsEquals";
case TokenType::ExclamationMark:
return "ExclamationMark";
case TokenType::ExclamationMarkEquals:
return "ExclamationMarkEquals";
case TokenType::ExclamationMarkEqualsEquals:
return "ExclamationMarkEqualsEquals";
case TokenType::Finally:
return "Finally";
case TokenType::For:
return "For";
case TokenType::Function:
return "Function";
case TokenType::GreaterThan:
return "GreaterThan";
case TokenType::GreaterThanEquals:
return "GreaterThanEquals";
case TokenType::Identifier:
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:
return "Invalid";
case TokenType::LessThan:
return "LessThan";
case TokenType::LessThanEquals:
return "LessThanEquals";
case TokenType::Let:
return "Let";
case TokenType::Minus:
return "Minus";
case TokenType::MinusEquals:
return "MinusEquals";
case TokenType::MinusMinus:
return "MinusMinus";
case TokenType::New:
return "New";
case TokenType::NullLiteral:
return "NullLiteral";
case TokenType::NumericLiteral:
return "NumericLiteral";
case TokenType::ParenClose:
return "ParenClose";
case TokenType::ParenOpen:
return "ParenOpen";
case TokenType::Percent:
return "Percent";
case TokenType::PercentEquals:
return "PercentEquals";
case TokenType::Period:
return "Period";
case TokenType::Pipe:
return "Pipe";
case TokenType::PipeEquals:
return "PipeEquals";
case TokenType::Plus:
return "Plus";
case TokenType::PlusEquals:
return "PlusEquals";
case TokenType::PlusPlus:
return "PlusPlus";
case TokenType::QuestionMark:
return "QuestionMark";
case TokenType::QuestionMarkPeriod:
return "QuestionMarkPeriod";
case TokenType::RegexLiteral:
return "RegexLiteral";
case TokenType::Return:
return "Return";
case TokenType::Semicolon:
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::Switch:
return "Switch";
case TokenType::Tilde:
return "Tilde";
case TokenType::Try:
return "Try";
case TokenType::Typeof:
return "Typeof";
case TokenType::UndefinedLiteral:
return "UndefinedLiteral";
case TokenType::UnsignedShiftRight:
return "UnsignedShiftRight";
case TokenType::UnsignedShiftRightEquals:
return "UnsignedShiftRightEquals";
case TokenType::UnterminatedStringLiteral:
return "UnterminatedStringLiteral";
case TokenType::Var:
return "Var";
case TokenType::Void:
return "Void";
case TokenType::While:
return "While";
case TokenType::Yield:
return "Yield";
#define __ENUMERATE_JS_TOKEN(x) \
case TokenType::x: \
return #x;
ENUMERATE_JS_TOKENS
#undef __ENUMERATE_JS_TOKEN
default:
ASSERT_NOT_REACHED();
return "<Unknown>";

View file

@ -31,96 +31,101 @@
namespace JS {
#define ENUMERATE_JS_TOKENS \
__ENUMERATE_JS_TOKEN(Ampersand) \
__ENUMERATE_JS_TOKEN(AmpersandEquals) \
__ENUMERATE_JS_TOKEN(Asterisk) \
__ENUMERATE_JS_TOKEN(AsteriskAsteriskEquals) \
__ENUMERATE_JS_TOKEN(AsteriskEquals) \
__ENUMERATE_JS_TOKEN(Await) \
__ENUMERATE_JS_TOKEN(BoolLiteral) \
__ENUMERATE_JS_TOKEN(BracketClose) \
__ENUMERATE_JS_TOKEN(BracketOpen) \
__ENUMERATE_JS_TOKEN(Break) \
__ENUMERATE_JS_TOKEN(Caret) \
__ENUMERATE_JS_TOKEN(Case) \
__ENUMERATE_JS_TOKEN(Catch) \
__ENUMERATE_JS_TOKEN(Class) \
__ENUMERATE_JS_TOKEN(Colon) \
__ENUMERATE_JS_TOKEN(Comma) \
__ENUMERATE_JS_TOKEN(Const) \
__ENUMERATE_JS_TOKEN(CurlyClose) \
__ENUMERATE_JS_TOKEN(CurlyOpen) \
__ENUMERATE_JS_TOKEN(Default) \
__ENUMERATE_JS_TOKEN(Delete) \
__ENUMERATE_JS_TOKEN(Do) \
__ENUMERATE_JS_TOKEN(DoubleAmpersand) \
__ENUMERATE_JS_TOKEN(DoubleAsterisk) \
__ENUMERATE_JS_TOKEN(DoublePipe) \
__ENUMERATE_JS_TOKEN(DoubleQuestionMark) \
__ENUMERATE_JS_TOKEN(Else) \
__ENUMERATE_JS_TOKEN(Eof) \
__ENUMERATE_JS_TOKEN(Equals) \
__ENUMERATE_JS_TOKEN(EqualsEquals) \
__ENUMERATE_JS_TOKEN(EqualsEqualsEquals) \
__ENUMERATE_JS_TOKEN(ExclamationMark) \
__ENUMERATE_JS_TOKEN(ExclamationMarkEquals) \
__ENUMERATE_JS_TOKEN(ExclamationMarkEqualsEquals) \
__ENUMERATE_JS_TOKEN(Finally) \
__ENUMERATE_JS_TOKEN(For) \
__ENUMERATE_JS_TOKEN(Function) \
__ENUMERATE_JS_TOKEN(GreaterThan) \
__ENUMERATE_JS_TOKEN(GreaterThanEquals) \
__ENUMERATE_JS_TOKEN(Identifier) \
__ENUMERATE_JS_TOKEN(If) \
__ENUMERATE_JS_TOKEN(In) \
__ENUMERATE_JS_TOKEN(Instanceof) \
__ENUMERATE_JS_TOKEN(Interface) \
__ENUMERATE_JS_TOKEN(Invalid) \
__ENUMERATE_JS_TOKEN(LessThan) \
__ENUMERATE_JS_TOKEN(LessThanEquals) \
__ENUMERATE_JS_TOKEN(Let) \
__ENUMERATE_JS_TOKEN(Minus) \
__ENUMERATE_JS_TOKEN(MinusEquals) \
__ENUMERATE_JS_TOKEN(MinusMinus) \
__ENUMERATE_JS_TOKEN(New) \
__ENUMERATE_JS_TOKEN(NullLiteral) \
__ENUMERATE_JS_TOKEN(NumericLiteral) \
__ENUMERATE_JS_TOKEN(ParenClose) \
__ENUMERATE_JS_TOKEN(ParenOpen) \
__ENUMERATE_JS_TOKEN(Percent) \
__ENUMERATE_JS_TOKEN(PercentEquals) \
__ENUMERATE_JS_TOKEN(Period) \
__ENUMERATE_JS_TOKEN(Pipe) \
__ENUMERATE_JS_TOKEN(PipeEquals) \
__ENUMERATE_JS_TOKEN(Plus) \
__ENUMERATE_JS_TOKEN(PlusEquals) \
__ENUMERATE_JS_TOKEN(PlusPlus) \
__ENUMERATE_JS_TOKEN(QuestionMark) \
__ENUMERATE_JS_TOKEN(QuestionMarkPeriod) \
__ENUMERATE_JS_TOKEN(RegexLiteral) \
__ENUMERATE_JS_TOKEN(Return) \
__ENUMERATE_JS_TOKEN(Semicolon) \
__ENUMERATE_JS_TOKEN(ShiftLeft) \
__ENUMERATE_JS_TOKEN(ShiftLeftEquals) \
__ENUMERATE_JS_TOKEN(ShiftRight) \
__ENUMERATE_JS_TOKEN(ShiftRightEquals) \
__ENUMERATE_JS_TOKEN(Slash) \
__ENUMERATE_JS_TOKEN(SlashEquals) \
__ENUMERATE_JS_TOKEN(StringLiteral) \
__ENUMERATE_JS_TOKEN(Switch) \
__ENUMERATE_JS_TOKEN(Throw) \
__ENUMERATE_JS_TOKEN(Tilde) \
__ENUMERATE_JS_TOKEN(Try) \
__ENUMERATE_JS_TOKEN(Typeof) \
__ENUMERATE_JS_TOKEN(UndefinedLiteral) \
__ENUMERATE_JS_TOKEN(UnsignedShiftRight) \
__ENUMERATE_JS_TOKEN(UnsignedShiftRightEquals) \
__ENUMERATE_JS_TOKEN(UnterminatedStringLiteral) \
__ENUMERATE_JS_TOKEN(Var) \
__ENUMERATE_JS_TOKEN(Void) \
__ENUMERATE_JS_TOKEN(While) \
__ENUMERATE_JS_TOKEN(Yield)
enum class TokenType {
Ampersand,
AmpersandEquals,
Asterisk,
AsteriskAsteriskEquals,
AsteriskEquals,
Await,
BoolLiteral,
BracketClose,
BracketOpen,
Break,
Caret,
Case,
Catch,
Class,
Colon,
Comma,
Const,
CurlyClose,
CurlyOpen,
Default,
Delete,
Do,
DoubleAmpersand,
DoubleAsterisk,
DoublePipe,
DoubleQuestionMark,
Else,
Eof,
Equals,
EqualsEquals,
EqualsEqualsEquals,
ExclamationMark,
ExclamationMarkEquals,
ExclamationMarkEqualsEquals,
Finally,
For,
Function,
GreaterThan,
GreaterThanEquals,
Identifier,
If,
In,
Instanceof,
Interface,
Invalid,
LessThan,
LessThanEquals,
Let,
Minus,
MinusEquals,
MinusMinus,
New,
NullLiteral,
NumericLiteral,
ParenClose,
ParenOpen,
Percent,
PercentEquals,
Period,
Pipe,
PipeEquals,
Plus,
PlusEquals,
PlusPlus,
QuestionMark,
QuestionMarkPeriod,
RegexLiteral,
Return,
Semicolon,
ShiftLeft,
ShiftLeftEquals,
ShiftRight,
ShiftRightEquals,
Slash,
SlashEquals,
StringLiteral,
Switch,
Throw,
Tilde,
Try,
Typeof,
UndefinedLiteral,
UnsignedShiftRight,
UnsignedShiftRightEquals,
UnterminatedStringLiteral,
Var,
Void,
While,
Yield,
#define __ENUMERATE_JS_TOKEN(x) x,
ENUMERATE_JS_TOKENS
#undef __ENUMERATE_JS_TOKEN
};
class Token {