Serenity Operating System
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}