2 * Copyright (C) 2010, 2013 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
26 #ifndef ParserTokens_h
27 #define ParserTokens_h
29 #include "ParserModes.h"
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
47 #define BINARY_OP_PRECEDENCE(prec) (((prec) << BinaryOpTokenPrecedenceShift) | ((prec) << (BinaryOpTokenPrecedenceShift + BinaryOpTokenAllowsInPrecedenceAdditionalShift)))
48 #define IN_OP_PRECEDENCE(prec) ((prec) << (BinaryOpTokenPrecedenceShift + BinaryOpTokenAllowsInPrecedenceAdditionalShift))
51 NULLTOKEN = KeywordTokenFlag,
78 #if ENABLE(ES6_CLASS_SYNTAX)
84 CLASSTOKEN = RESERVED,
86 STATICTOKEN = RESERVED_IF_STRICT,
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
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) { }
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)); }
177 operator int() const { return offset; }
188 uint32_t lineStartOffset;
191 const Identifier* ident;
194 struct JSTokenLocation {
195 JSTokenLocation() : line(0), lineStartOffset(0), startOffset(0) { }
196 JSTokenLocation(const JSTokenLocation& location)
198 line = location.line;
199 lineStartOffset = location.lineStartOffset;
200 startOffset = location.startOffset;
201 endOffset = location.endOffset;
205 unsigned lineStartOffset;
206 unsigned startOffset;
213 JSTokenLocation m_location;
214 JSTextPosition m_startPosition;
215 JSTextPosition m_endPosition;
220 #endif // ParserTokens_h