[ES6] Implement ES6 template literals
[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     TEMPLATE,
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     INVALID_BINARY_NUMBER_ERRORTOK = 12 | ErrorTokenFlag,
166     UNTERMINATED_TEMPLATE_LITERAL_ERRORTOK = 13 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
167     INVALID_TEMPLATE_LITERAL_ERRORTOK = 14 | ErrorTokenFlag,
168 };
169
170 struct JSTextPosition {
171     JSTextPosition() : line(0), offset(0), lineStartOffset(0) { }
172     JSTextPosition(int _line, int _offset, int _lineStartOffset) : line(_line), offset(_offset), lineStartOffset(_lineStartOffset) { }
173     JSTextPosition(const JSTextPosition& other) : line(other.line), offset(other.offset), lineStartOffset(other.lineStartOffset) { }
174
175     JSTextPosition operator+(int adjustment) const { return JSTextPosition(line, offset + adjustment, lineStartOffset); }
176     JSTextPosition operator+(unsigned adjustment) const { return *this + static_cast<int>(adjustment); }
177     JSTextPosition operator-(int adjustment) const { return *this + (- adjustment); }
178     JSTextPosition operator-(unsigned adjustment) const { return *this + (- static_cast<int>(adjustment)); }
179
180     operator int() const { return offset; }
181
182     int line;
183     int offset;
184     int lineStartOffset;
185 };
186
187 union JSTokenData {
188     struct {
189         uint32_t line;
190         uint32_t offset;
191         uint32_t lineStartOffset;
192     };
193     double doubleValue;
194     const Identifier* ident;
195     struct {
196         const Identifier* cooked;
197         const Identifier* raw;
198         bool isTail;
199     };
200 };
201
202 struct JSTokenLocation {
203     JSTokenLocation() : line(0), lineStartOffset(0), startOffset(0) { }
204     JSTokenLocation(const JSTokenLocation& location)
205     {
206         line = location.line;
207         lineStartOffset = location.lineStartOffset;
208         startOffset = location.startOffset;
209         endOffset = location.endOffset;
210     }
211
212     int line;
213     unsigned lineStartOffset;
214     unsigned startOffset;
215     unsigned endOffset;
216 };
217
218 struct JSToken {
219     JSTokenType m_type;
220     JSTokenData m_data;
221     JSTokenLocation m_location;
222     JSTextPosition m_startPosition;
223     JSTextPosition m_endPosition;
224 };
225
226 } // namespace JSC
227
228 #endif // ParserTokens_h