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