Serenity Operating System
at hosted 171 lines 7.8 kB view raw
1/* 2 * Copyright (c) 2020, Stephan Unverwerth <s.unverwerth@gmx.de> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, this 9 * list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright notice, 12 * this list of conditions and the following disclaimer in the documentation 13 * and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 22 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 23 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#pragma once 28 29#include <AK/String.h> 30#include <AK/StringView.h> 31 32namespace JS { 33 34#define ENUMERATE_JS_TOKENS \ 35 __ENUMERATE_JS_TOKEN(Ampersand) \ 36 __ENUMERATE_JS_TOKEN(AmpersandEquals) \ 37 __ENUMERATE_JS_TOKEN(Arrow) \ 38 __ENUMERATE_JS_TOKEN(Asterisk) \ 39 __ENUMERATE_JS_TOKEN(AsteriskAsteriskEquals) \ 40 __ENUMERATE_JS_TOKEN(AsteriskEquals) \ 41 __ENUMERATE_JS_TOKEN(Await) \ 42 __ENUMERATE_JS_TOKEN(BoolLiteral) \ 43 __ENUMERATE_JS_TOKEN(BracketClose) \ 44 __ENUMERATE_JS_TOKEN(BracketOpen) \ 45 __ENUMERATE_JS_TOKEN(Break) \ 46 __ENUMERATE_JS_TOKEN(Caret) \ 47 __ENUMERATE_JS_TOKEN(Case) \ 48 __ENUMERATE_JS_TOKEN(Catch) \ 49 __ENUMERATE_JS_TOKEN(Class) \ 50 __ENUMERATE_JS_TOKEN(Colon) \ 51 __ENUMERATE_JS_TOKEN(Comma) \ 52 __ENUMERATE_JS_TOKEN(Const) \ 53 __ENUMERATE_JS_TOKEN(Continue) \ 54 __ENUMERATE_JS_TOKEN(CurlyClose) \ 55 __ENUMERATE_JS_TOKEN(CurlyOpen) \ 56 __ENUMERATE_JS_TOKEN(Default) \ 57 __ENUMERATE_JS_TOKEN(Delete) \ 58 __ENUMERATE_JS_TOKEN(Do) \ 59 __ENUMERATE_JS_TOKEN(DoubleAmpersand) \ 60 __ENUMERATE_JS_TOKEN(DoubleAsterisk) \ 61 __ENUMERATE_JS_TOKEN(DoublePipe) \ 62 __ENUMERATE_JS_TOKEN(DoubleQuestionMark) \ 63 __ENUMERATE_JS_TOKEN(Else) \ 64 __ENUMERATE_JS_TOKEN(Eof) \ 65 __ENUMERATE_JS_TOKEN(Equals) \ 66 __ENUMERATE_JS_TOKEN(EqualsEquals) \ 67 __ENUMERATE_JS_TOKEN(EqualsEqualsEquals) \ 68 __ENUMERATE_JS_TOKEN(ExclamationMark) \ 69 __ENUMERATE_JS_TOKEN(ExclamationMarkEquals) \ 70 __ENUMERATE_JS_TOKEN(ExclamationMarkEqualsEquals) \ 71 __ENUMERATE_JS_TOKEN(Finally) \ 72 __ENUMERATE_JS_TOKEN(For) \ 73 __ENUMERATE_JS_TOKEN(Function) \ 74 __ENUMERATE_JS_TOKEN(GreaterThan) \ 75 __ENUMERATE_JS_TOKEN(GreaterThanEquals) \ 76 __ENUMERATE_JS_TOKEN(Identifier) \ 77 __ENUMERATE_JS_TOKEN(If) \ 78 __ENUMERATE_JS_TOKEN(In) \ 79 __ENUMERATE_JS_TOKEN(Instanceof) \ 80 __ENUMERATE_JS_TOKEN(Interface) \ 81 __ENUMERATE_JS_TOKEN(Invalid) \ 82 __ENUMERATE_JS_TOKEN(LessThan) \ 83 __ENUMERATE_JS_TOKEN(LessThanEquals) \ 84 __ENUMERATE_JS_TOKEN(Let) \ 85 __ENUMERATE_JS_TOKEN(Minus) \ 86 __ENUMERATE_JS_TOKEN(MinusEquals) \ 87 __ENUMERATE_JS_TOKEN(MinusMinus) \ 88 __ENUMERATE_JS_TOKEN(New) \ 89 __ENUMERATE_JS_TOKEN(NullLiteral) \ 90 __ENUMERATE_JS_TOKEN(NumericLiteral) \ 91 __ENUMERATE_JS_TOKEN(ParenClose) \ 92 __ENUMERATE_JS_TOKEN(ParenOpen) \ 93 __ENUMERATE_JS_TOKEN(Percent) \ 94 __ENUMERATE_JS_TOKEN(PercentEquals) \ 95 __ENUMERATE_JS_TOKEN(Period) \ 96 __ENUMERATE_JS_TOKEN(Pipe) \ 97 __ENUMERATE_JS_TOKEN(PipeEquals) \ 98 __ENUMERATE_JS_TOKEN(Plus) \ 99 __ENUMERATE_JS_TOKEN(PlusEquals) \ 100 __ENUMERATE_JS_TOKEN(PlusPlus) \ 101 __ENUMERATE_JS_TOKEN(QuestionMark) \ 102 __ENUMERATE_JS_TOKEN(QuestionMarkPeriod) \ 103 __ENUMERATE_JS_TOKEN(RegexLiteral) \ 104 __ENUMERATE_JS_TOKEN(Return) \ 105 __ENUMERATE_JS_TOKEN(Semicolon) \ 106 __ENUMERATE_JS_TOKEN(ShiftLeft) \ 107 __ENUMERATE_JS_TOKEN(ShiftLeftEquals) \ 108 __ENUMERATE_JS_TOKEN(ShiftRight) \ 109 __ENUMERATE_JS_TOKEN(ShiftRightEquals) \ 110 __ENUMERATE_JS_TOKEN(Slash) \ 111 __ENUMERATE_JS_TOKEN(SlashEquals) \ 112 __ENUMERATE_JS_TOKEN(StringLiteral) \ 113 __ENUMERATE_JS_TOKEN(Switch) \ 114 __ENUMERATE_JS_TOKEN(Throw) \ 115 __ENUMERATE_JS_TOKEN(Tilde) \ 116 __ENUMERATE_JS_TOKEN(Try) \ 117 __ENUMERATE_JS_TOKEN(Typeof) \ 118 __ENUMERATE_JS_TOKEN(UnsignedShiftRight) \ 119 __ENUMERATE_JS_TOKEN(UnsignedShiftRightEquals) \ 120 __ENUMERATE_JS_TOKEN(UnterminatedStringLiteral) \ 121 __ENUMERATE_JS_TOKEN(Var) \ 122 __ENUMERATE_JS_TOKEN(Void) \ 123 __ENUMERATE_JS_TOKEN(While) \ 124 __ENUMERATE_JS_TOKEN(Yield) 125 126enum class TokenType { 127#define __ENUMERATE_JS_TOKEN(x) x, 128 ENUMERATE_JS_TOKENS 129#undef __ENUMERATE_JS_TOKEN 130}; 131 132class Token { 133public: 134 Token(TokenType type, StringView trivia, StringView value, size_t line_number, size_t line_column) 135 : m_type(type) 136 , m_trivia(trivia) 137 , m_value(value) 138 , m_line_number(line_number) 139 , m_line_column(line_column) 140 { 141 } 142 143 TokenType type() const { return m_type; } 144 const char* name() const; 145 static const char* name(TokenType); 146 147 const StringView& trivia() const { return m_trivia; } 148 const StringView& value() const { return m_value; } 149 size_t line_number() const { return m_line_number; } 150 size_t line_column() const { return m_line_column; } 151 double double_value() const; 152 String string_value() const; 153 bool bool_value() const; 154 155private: 156 TokenType m_type; 157 StringView m_trivia; 158 StringView m_value; 159 size_t m_line_number; 160 size_t m_line_column; 161}; 162 163} 164 165namespace AK { 166template<> 167struct Traits<JS::TokenType> : public GenericTraits<JS::TokenType> { 168 static constexpr bool is_trivial() { return true; } 169 static unsigned hash(JS::TokenType t) { return int_hash((int)t); } 170}; 171}