3ff279866af6e28690bc07c5f721bc7a38056ea2
[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     CONSTTOKEN,
61     CONTINUE,
62     FUNCTION,
63     RETURN,
64     IF,
65     THISTOKEN,
66     DO,
67     WHILE,
68     SWITCH,
69     WITH,
70     RESERVED,
71     RESERVED_IF_STRICT,
72     THROW,
73     TRY,
74     CATCH,
75     FINALLY,
76     DEBUGGER,
77     ELSE,
78 #if ENABLE(ES6_CLASS_SYNTAX)
79     CLASSTOKEN,
80     EXTENDS,
81     STATICTOKEN,
82     SUPER,
83 #else
84     CLASSTOKEN = RESERVED,
85     EXTENDS = RESERVED,
86     STATICTOKEN = RESERVED_IF_STRICT,
87     SUPER = RESERVED,
88 #endif
89     OPENBRACE = 0,
90     CLOSEBRACE,
91     OPENPAREN,
92     CLOSEPAREN,
93     OPENBRACKET,
94     CLOSEBRACKET,
95     COMMA,
96     QUESTION,
97     INTEGER,
98     DOUBLE,
99     IDENT,
100     STRING,
101     SEMICOLON,
102     COLON,
103     DOT,
104     EOFTOK,
105     EQUAL,
106     PLUSEQUAL,
107     MINUSEQUAL,
108     MULTEQUAL,
109     DIVEQUAL,
110     LSHIFTEQUAL,
111     RSHIFTEQUAL,
112     URSHIFTEQUAL,
113     ANDEQUAL,
114     MODEQUAL,
115     XOREQUAL,
116     OREQUAL,
117     DOTDOTDOT,
118     LastUntaggedToken,
119
120     // Begin tagged tokens
121     PLUSPLUS = 0 | UnaryOpTokenFlag,
122     MINUSMINUS = 1 | UnaryOpTokenFlag,
123     EXCLAMATION = 2 | UnaryOpTokenFlag,
124     TILDE = 3 | UnaryOpTokenFlag,
125     AUTOPLUSPLUS = 4 | UnaryOpTokenFlag,
126     AUTOMINUSMINUS = 5 | UnaryOpTokenFlag,
127     TYPEOF = 6 | UnaryOpTokenFlag | KeywordTokenFlag,
128     VOIDTOKEN = 7 | UnaryOpTokenFlag | KeywordTokenFlag,
129     DELETETOKEN = 8 | UnaryOpTokenFlag | KeywordTokenFlag,
130     OR = 0 | BINARY_OP_PRECEDENCE(1),
131     AND = 1 | BINARY_OP_PRECEDENCE(2),
132     BITOR = 2 | BINARY_OP_PRECEDENCE(3),
133     BITXOR = 3 | BINARY_OP_PRECEDENCE(4),
134     BITAND = 4 | BINARY_OP_PRECEDENCE(5),
135     EQEQ = 5 | BINARY_OP_PRECEDENCE(6),
136     NE = 6 | BINARY_OP_PRECEDENCE(6),
137     STREQ = 7 | BINARY_OP_PRECEDENCE(6),
138     STRNEQ = 8 | BINARY_OP_PRECEDENCE(6),
139     LT = 9 | BINARY_OP_PRECEDENCE(7),
140     GT = 10 | BINARY_OP_PRECEDENCE(7),
141     LE = 11 | BINARY_OP_PRECEDENCE(7),
142     GE = 12 | BINARY_OP_PRECEDENCE(7),
143     INSTANCEOF = 13 | BINARY_OP_PRECEDENCE(7) | KeywordTokenFlag,
144     INTOKEN = 14 | IN_OP_PRECEDENCE(7) | KeywordTokenFlag,
145     LSHIFT = 15 | BINARY_OP_PRECEDENCE(8),
146     RSHIFT = 16 | BINARY_OP_PRECEDENCE(8),
147     URSHIFT = 17 | BINARY_OP_PRECEDENCE(8),
148     PLUS = 18 | BINARY_OP_PRECEDENCE(9) | UnaryOpTokenFlag,
149     MINUS = 19 | BINARY_OP_PRECEDENCE(9) | UnaryOpTokenFlag,
150     TIMES = 20 | BINARY_OP_PRECEDENCE(10),
151     DIVIDE = 21 | BINARY_OP_PRECEDENCE(10),
152     MOD = 22 | BINARY_OP_PRECEDENCE(10),
153     ERRORTOK = 0 | ErrorTokenFlag,
154     UNTERMINATED_IDENTIFIER_ESCAPE_ERRORTOK = 0 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
155     INVALID_IDENTIFIER_ESCAPE_ERRORTOK = 1 | ErrorTokenFlag,
156     UNTERMINATED_IDENTIFIER_UNICODE_ESCAPE_ERRORTOK = 2 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
157     INVALID_IDENTIFIER_UNICODE_ESCAPE_ERRORTOK = 3 | ErrorTokenFlag,
158     UNTERMINATED_MULTILINE_COMMENT_ERRORTOK = 4 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
159     UNTERMINATED_NUMERIC_LITERAL_ERRORTOK = 5 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
160     INVALID_OCTAL_NUMBER_ERRORTOK = 6 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
161     INVALID_NUMERIC_LITERAL_ERRORTOK = 7 | ErrorTokenFlag,
162     UNTERMINATED_STRING_LITERAL_ERRORTOK = 8 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
163     INVALID_STRING_LITERAL_ERRORTOK = 9 | ErrorTokenFlag,
164     INVALID_PRIVATE_NAME_ERRORTOK = 10 | ErrorTokenFlag,
165     INVALID_HEX_NUMBER_ERRORTOK = 11 | ErrorTokenFlag
166 };
167
168 struct JSTextPosition {
169     JSTextPosition() : line(0), offset(0), lineStartOffset(0) { }
170     JSTextPosition(int _line, int _offset, int _lineStartOffset) : line(_line), offset(_offset), lineStartOffset(_lineStartOffset) { }
171     JSTextPosition(const JSTextPosition& other) : line(other.line), offset(other.offset), lineStartOffset(other.lineStartOffset) { }
172
173     JSTextPosition operator+(int adjustment) const { return JSTextPosition(line, offset + adjustment, lineStartOffset); }
174     JSTextPosition operator+(unsigned adjustment) const { return *this + static_cast<int>(adjustment); }
175     JSTextPosition operator-(int adjustment) const { return *this + (- adjustment); }
176     JSTextPosition operator-(unsigned adjustment) const { return *this + (- static_cast<int>(adjustment)); }
177
178     operator int() const { return offset; }
179
180     int line;
181     int offset;
182     int lineStartOffset;
183 };
184
185 union JSTokenData {
186     struct {
187         uint32_t line;
188         uint32_t offset;
189         uint32_t lineStartOffset;
190     };
191     double doubleValue;
192     const Identifier* ident;
193 };
194
195 struct JSTokenLocation {
196     JSTokenLocation() : line(0), lineStartOffset(0), startOffset(0) { }
197     JSTokenLocation(const JSTokenLocation& location)
198     {
199         line = location.line;
200         lineStartOffset = location.lineStartOffset;
201         startOffset = location.startOffset;
202         endOffset = location.endOffset;
203     }
204
205     int line;
206     unsigned lineStartOffset;
207     unsigned startOffset;
208     unsigned endOffset;
209 };
210
211 struct JSToken {
212     JSTokenType m_type;
213     JSTokenData m_data;
214     JSTokenLocation m_location;
215     JSTextPosition m_startPosition;
216     JSTextPosition m_endPosition;
217 };
218
219 } // namespace JSC
220
221 #endif // ParserTokens_h