Add a build flag for ES6 class syntax
[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     NUMBER,
98     IDENT,
99     STRING,
100     SEMICOLON,
101     COLON,
102     DOT,
103     EOFTOK,
104     EQUAL,
105     PLUSEQUAL,
106     MINUSEQUAL,
107     MULTEQUAL,
108     DIVEQUAL,
109     LSHIFTEQUAL,
110     RSHIFTEQUAL,
111     URSHIFTEQUAL,
112     ANDEQUAL,
113     MODEQUAL,
114     XOREQUAL,
115     OREQUAL,
116     DOTDOTDOT,
117     LastUntaggedToken,
118
119     // Begin tagged tokens
120     PLUSPLUS = 0 | UnaryOpTokenFlag,
121     MINUSMINUS = 1 | UnaryOpTokenFlag,
122     EXCLAMATION = 2 | UnaryOpTokenFlag,
123     TILDE = 3 | UnaryOpTokenFlag,
124     AUTOPLUSPLUS = 4 | UnaryOpTokenFlag,
125     AUTOMINUSMINUS = 5 | UnaryOpTokenFlag,
126     TYPEOF = 6 | UnaryOpTokenFlag | KeywordTokenFlag,
127     VOIDTOKEN = 7 | UnaryOpTokenFlag | KeywordTokenFlag,
128     DELETETOKEN = 8 | UnaryOpTokenFlag | KeywordTokenFlag,
129     OR = 0 | BINARY_OP_PRECEDENCE(1),
130     AND = 1 | BINARY_OP_PRECEDENCE(2),
131     BITOR = 2 | BINARY_OP_PRECEDENCE(3),
132     BITXOR = 3 | BINARY_OP_PRECEDENCE(4),
133     BITAND = 4 | BINARY_OP_PRECEDENCE(5),
134     EQEQ = 5 | BINARY_OP_PRECEDENCE(6),
135     NE = 6 | BINARY_OP_PRECEDENCE(6),
136     STREQ = 7 | BINARY_OP_PRECEDENCE(6),
137     STRNEQ = 8 | BINARY_OP_PRECEDENCE(6),
138     LT = 9 | BINARY_OP_PRECEDENCE(7),
139     GT = 10 | BINARY_OP_PRECEDENCE(7),
140     LE = 11 | BINARY_OP_PRECEDENCE(7),
141     GE = 12 | BINARY_OP_PRECEDENCE(7),
142     INSTANCEOF = 13 | BINARY_OP_PRECEDENCE(7) | KeywordTokenFlag,
143     INTOKEN = 14 | IN_OP_PRECEDENCE(7) | KeywordTokenFlag,
144     LSHIFT = 15 | BINARY_OP_PRECEDENCE(8),
145     RSHIFT = 16 | BINARY_OP_PRECEDENCE(8),
146     URSHIFT = 17 | BINARY_OP_PRECEDENCE(8),
147     PLUS = 18 | BINARY_OP_PRECEDENCE(9) | UnaryOpTokenFlag,
148     MINUS = 19 | BINARY_OP_PRECEDENCE(9) | UnaryOpTokenFlag,
149     TIMES = 20 | BINARY_OP_PRECEDENCE(10),
150     DIVIDE = 21 | BINARY_OP_PRECEDENCE(10),
151     MOD = 22 | BINARY_OP_PRECEDENCE(10),
152     ERRORTOK = 0 | ErrorTokenFlag,
153     UNTERMINATED_IDENTIFIER_ESCAPE_ERRORTOK = 0 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
154     INVALID_IDENTIFIER_ESCAPE_ERRORTOK = 1 | ErrorTokenFlag,
155     UNTERMINATED_IDENTIFIER_UNICODE_ESCAPE_ERRORTOK = 2 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
156     INVALID_IDENTIFIER_UNICODE_ESCAPE_ERRORTOK = 3 | ErrorTokenFlag,
157     UNTERMINATED_MULTILINE_COMMENT_ERRORTOK = 4 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
158     UNTERMINATED_NUMERIC_LITERAL_ERRORTOK = 5 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
159     INVALID_OCTAL_NUMBER_ERRORTOK = 6 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
160     INVALID_NUMERIC_LITERAL_ERRORTOK = 7 | ErrorTokenFlag,
161     UNTERMINATED_STRING_LITERAL_ERRORTOK = 8 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
162     INVALID_STRING_LITERAL_ERRORTOK = 9 | ErrorTokenFlag,
163     INVALID_PRIVATE_NAME_ERRORTOK = 10 | ErrorTokenFlag,
164     INVALID_HEX_NUMBER_ERRORTOK = 11 | ErrorTokenFlag
165 };
166
167 struct JSTextPosition {
168     JSTextPosition() : line(0), offset(0), lineStartOffset(0) { }
169     JSTextPosition(int _line, int _offset, int _lineStartOffset) : line(_line), offset(_offset), lineStartOffset(_lineStartOffset) { }
170     JSTextPosition(const JSTextPosition& other) : line(other.line), offset(other.offset), lineStartOffset(other.lineStartOffset) { }
171
172     JSTextPosition operator+(int adjustment) const { return JSTextPosition(line, offset + adjustment, lineStartOffset); }
173     JSTextPosition operator+(unsigned adjustment) const { return *this + static_cast<int>(adjustment); }
174     JSTextPosition operator-(int adjustment) const { return *this + (- adjustment); }
175     JSTextPosition operator-(unsigned adjustment) const { return *this + (- static_cast<int>(adjustment)); }
176
177     operator int() const { return offset; }
178
179     int line;
180     int offset;
181     int lineStartOffset;
182 };
183
184 union JSTokenData {
185     struct {
186         uint32_t line;
187         uint32_t offset;
188         uint32_t lineStartOffset;
189     };
190     double doubleValue;
191     const Identifier* ident;
192 };
193
194 struct JSTokenLocation {
195     JSTokenLocation() : line(0), lineStartOffset(0), startOffset(0) { }
196     JSTokenLocation(const JSTokenLocation& location)
197     {
198         line = location.line;
199         lineStartOffset = location.lineStartOffset;
200         startOffset = location.startOffset;
201         endOffset = location.endOffset;
202     }
203
204     int line;
205     unsigned lineStartOffset;
206     unsigned startOffset;
207     unsigned endOffset;
208 };
209
210 struct JSToken {
211     JSTokenType m_type;
212     JSTokenData m_data;
213     JSTokenLocation m_location;
214     JSTextPosition m_startPosition;
215     JSTextPosition m_endPosition;
216 };
217
218 } // namespace JSC
219
220 #endif // ParserTokens_h