93b88aa13fd7383ceb19640b49cf10947d4a31ba
[WebKit-https.git] / Source / JavaScriptCore / parser / ParserTokens.h
1 /*
2  * Copyright (C) 2010, 2013 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef ParserTokens_h
27 #define ParserTokens_h
28
29 #include "ParserModes.h"
30 #include <limits.h>
31 #include <stdint.h>
32
33 namespace JSC {
34
35 class Identifier;
36
37 enum {
38     UnaryOpTokenFlag = 64,
39     KeywordTokenFlag = 128,
40     BinaryOpTokenPrecedenceShift = 8,
41     BinaryOpTokenAllowsInPrecedenceAdditionalShift = 4,
42     BinaryOpTokenPrecedenceMask = 15 << BinaryOpTokenPrecedenceShift,
43     ErrorTokenFlag = 1 << (BinaryOpTokenAllowsInPrecedenceAdditionalShift + BinaryOpTokenPrecedenceShift + 7),
44     UnterminatedErrorTokenFlag = ErrorTokenFlag << 1
45 };
46
47 #define BINARY_OP_PRECEDENCE(prec) (((prec) << BinaryOpTokenPrecedenceShift) | ((prec) << (BinaryOpTokenPrecedenceShift + BinaryOpTokenAllowsInPrecedenceAdditionalShift)))
48 #define IN_OP_PRECEDENCE(prec) ((prec) << (BinaryOpTokenPrecedenceShift + BinaryOpTokenAllowsInPrecedenceAdditionalShift))
49
50 enum JSTokenType {
51     NULLTOKEN = KeywordTokenFlag,
52     TRUETOKEN,
53     FALSETOKEN,
54     BREAK,
55     CASE,
56     DEFAULT,
57     FOR,
58     NEW,
59     VAR,
60     LET,
61     CONSTTOKEN,
62     CONTINUE,
63     FUNCTION,
64     RETURN,
65     IF,
66     THISTOKEN,
67     DO,
68     WHILE,
69     SWITCH,
70     WITH,
71     RESERVED,
72     RESERVED_IF_STRICT,
73     THROW,
74     TRY,
75     CATCH,
76     FINALLY,
77     DEBUGGER,
78     ELSE,
79 #if ENABLE(ES6_ARROWFUNCTION_SYNTAX)
80     ARROWFUNCTION,
81 #endif
82 #if ENABLE(ES6_CLASS_SYNTAX)
83     CLASSTOKEN,
84     EXTENDS,
85     SUPER,
86 #else
87     CLASSTOKEN = RESERVED,
88     EXTENDS = RESERVED,
89     SUPER = RESERVED,
90 #endif
91     OPENBRACE = 0,
92     CLOSEBRACE,
93     OPENPAREN,
94     CLOSEPAREN,
95     OPENBRACKET,
96     CLOSEBRACKET,
97     COMMA,
98     QUESTION,
99     INTEGER,
100     DOUBLE,
101     IDENT,
102     STRING,
103     TEMPLATE,
104     SEMICOLON,
105     COLON,
106     DOT,
107     EOFTOK,
108     EQUAL,
109     PLUSEQUAL,
110     MINUSEQUAL,
111     MULTEQUAL,
112     DIVEQUAL,
113     LSHIFTEQUAL,
114     RSHIFTEQUAL,
115     URSHIFTEQUAL,
116     ANDEQUAL,
117     MODEQUAL,
118     XOREQUAL,
119     OREQUAL,
120     DOTDOTDOT,
121     LastUntaggedToken,
122
123     // Begin tagged tokens
124     PLUSPLUS = 0 | UnaryOpTokenFlag,
125     MINUSMINUS = 1 | UnaryOpTokenFlag,
126     EXCLAMATION = 2 | UnaryOpTokenFlag,
127     TILDE = 3 | UnaryOpTokenFlag,
128     AUTOPLUSPLUS = 4 | UnaryOpTokenFlag,
129     AUTOMINUSMINUS = 5 | UnaryOpTokenFlag,
130     TYPEOF = 6 | UnaryOpTokenFlag | KeywordTokenFlag,
131     VOIDTOKEN = 7 | UnaryOpTokenFlag | KeywordTokenFlag,
132     DELETETOKEN = 8 | UnaryOpTokenFlag | KeywordTokenFlag,
133     OR = 0 | BINARY_OP_PRECEDENCE(1),
134     AND = 1 | BINARY_OP_PRECEDENCE(2),
135     BITOR = 2 | BINARY_OP_PRECEDENCE(3),
136     BITXOR = 3 | BINARY_OP_PRECEDENCE(4),
137     BITAND = 4 | BINARY_OP_PRECEDENCE(5),
138     EQEQ = 5 | BINARY_OP_PRECEDENCE(6),
139     NE = 6 | BINARY_OP_PRECEDENCE(6),
140     STREQ = 7 | BINARY_OP_PRECEDENCE(6),
141     STRNEQ = 8 | BINARY_OP_PRECEDENCE(6),
142     LT = 9 | BINARY_OP_PRECEDENCE(7),
143     GT = 10 | BINARY_OP_PRECEDENCE(7),
144     LE = 11 | BINARY_OP_PRECEDENCE(7),
145     GE = 12 | BINARY_OP_PRECEDENCE(7),
146     INSTANCEOF = 13 | BINARY_OP_PRECEDENCE(7) | KeywordTokenFlag,
147     INTOKEN = 14 | IN_OP_PRECEDENCE(7) | KeywordTokenFlag,
148     LSHIFT = 15 | BINARY_OP_PRECEDENCE(8),
149     RSHIFT = 16 | BINARY_OP_PRECEDENCE(8),
150     URSHIFT = 17 | BINARY_OP_PRECEDENCE(8),
151     PLUS = 18 | BINARY_OP_PRECEDENCE(9) | UnaryOpTokenFlag,
152     MINUS = 19 | BINARY_OP_PRECEDENCE(9) | UnaryOpTokenFlag,
153     TIMES = 20 | BINARY_OP_PRECEDENCE(10),
154     DIVIDE = 21 | BINARY_OP_PRECEDENCE(10),
155     MOD = 22 | BINARY_OP_PRECEDENCE(10),
156     ERRORTOK = 0 | ErrorTokenFlag,
157     UNTERMINATED_IDENTIFIER_ESCAPE_ERRORTOK = 0 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
158     INVALID_IDENTIFIER_ESCAPE_ERRORTOK = 1 | ErrorTokenFlag,
159     UNTERMINATED_IDENTIFIER_UNICODE_ESCAPE_ERRORTOK = 2 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
160     INVALID_IDENTIFIER_UNICODE_ESCAPE_ERRORTOK = 3 | ErrorTokenFlag,
161     UNTERMINATED_MULTILINE_COMMENT_ERRORTOK = 4 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
162     UNTERMINATED_NUMERIC_LITERAL_ERRORTOK = 5 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
163     INVALID_OCTAL_NUMBER_ERRORTOK = 6 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
164     INVALID_NUMERIC_LITERAL_ERRORTOK = 7 | ErrorTokenFlag,
165     UNTERMINATED_STRING_LITERAL_ERRORTOK = 8 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
166     INVALID_STRING_LITERAL_ERRORTOK = 9 | ErrorTokenFlag,
167     INVALID_PRIVATE_NAME_ERRORTOK = 10 | ErrorTokenFlag,
168     INVALID_HEX_NUMBER_ERRORTOK = 11 | ErrorTokenFlag,
169     INVALID_BINARY_NUMBER_ERRORTOK = 12 | ErrorTokenFlag,
170     UNTERMINATED_TEMPLATE_LITERAL_ERRORTOK = 13 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
171     INVALID_TEMPLATE_LITERAL_ERRORTOK = 14 | ErrorTokenFlag,
172 };
173
174 struct JSTextPosition {
175     JSTextPosition() : line(0), offset(0), lineStartOffset(0) { }
176     JSTextPosition(int _line, int _offset, int _lineStartOffset) : line(_line), offset(_offset), lineStartOffset(_lineStartOffset) { }
177     JSTextPosition(const JSTextPosition& other) : line(other.line), offset(other.offset), lineStartOffset(other.lineStartOffset) { }
178
179     JSTextPosition operator+(int adjustment) const { return JSTextPosition(line, offset + adjustment, lineStartOffset); }
180     JSTextPosition operator+(unsigned adjustment) const { return *this + static_cast<int>(adjustment); }
181     JSTextPosition operator-(int adjustment) const { return *this + (- adjustment); }
182     JSTextPosition operator-(unsigned adjustment) const { return *this + (- static_cast<int>(adjustment)); }
183
184     operator int() const { return offset; }
185
186     int line;
187     int offset;
188     int lineStartOffset;
189 };
190
191 union JSTokenData {
192     struct {
193         uint32_t line;
194         uint32_t offset;
195         uint32_t lineStartOffset;
196     };
197     double doubleValue;
198     const Identifier* ident;
199     struct {
200         const Identifier* cooked;
201         const Identifier* raw;
202         bool isTail;
203     };
204 };
205
206 struct JSTokenLocation {
207     JSTokenLocation() : line(0), lineStartOffset(0), startOffset(0) { }
208     JSTokenLocation(const JSTokenLocation& location)
209     {
210         line = location.line;
211         lineStartOffset = location.lineStartOffset;
212         startOffset = location.startOffset;
213         endOffset = location.endOffset;
214     }
215
216     int line;
217     unsigned lineStartOffset;
218     unsigned startOffset;
219     unsigned endOffset;
220 };
221
222 struct JSToken {
223     JSTokenType m_type;
224     JSTokenData m_data;
225     JSTokenLocation m_location;
226     JSTextPosition m_startPosition;
227     JSTextPosition m_endPosition;
228 };
229
230 } // namespace JSC
231
232 #endif // ParserTokens_h