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_ARROWFUNCTION_SYNTAX)
81 #if ENABLE(ES6_CLASS_SYNTAX)
86 CLASSTOKEN
= RESERVED
,
122 // Begin tagged tokens
123 PLUSPLUS
= 0 | UnaryOpTokenFlag
,
124 MINUSMINUS
= 1 | UnaryOpTokenFlag
,
125 EXCLAMATION
= 2 | UnaryOpTokenFlag
,
126 TILDE
= 3 | UnaryOpTokenFlag
,
127 AUTOPLUSPLUS
= 4 | UnaryOpTokenFlag
,
128 AUTOMINUSMINUS
= 5 | UnaryOpTokenFlag
,
129 TYPEOF
= 6 | UnaryOpTokenFlag
| KeywordTokenFlag
,
130 VOIDTOKEN
= 7 | UnaryOpTokenFlag
| KeywordTokenFlag
,
131 DELETETOKEN
= 8 | UnaryOpTokenFlag
| KeywordTokenFlag
,
132 OR
= 0 | BINARY_OP_PRECEDENCE(1),
133 AND
= 1 | BINARY_OP_PRECEDENCE(2),
134 BITOR
= 2 | BINARY_OP_PRECEDENCE(3),
135 BITXOR
= 3 | BINARY_OP_PRECEDENCE(4),
136 BITAND
= 4 | BINARY_OP_PRECEDENCE(5),
137 EQEQ
= 5 | BINARY_OP_PRECEDENCE(6),
138 NE
= 6 | BINARY_OP_PRECEDENCE(6),
139 STREQ
= 7 | BINARY_OP_PRECEDENCE(6),
140 STRNEQ
= 8 | BINARY_OP_PRECEDENCE(6),
141 LT
= 9 | BINARY_OP_PRECEDENCE(7),
142 GT
= 10 | BINARY_OP_PRECEDENCE(7),
143 LE
= 11 | BINARY_OP_PRECEDENCE(7),
144 GE
= 12 | BINARY_OP_PRECEDENCE(7),
145 INSTANCEOF
= 13 | BINARY_OP_PRECEDENCE(7) | KeywordTokenFlag
,
146 INTOKEN
= 14 | IN_OP_PRECEDENCE(7) | KeywordTokenFlag
,
147 LSHIFT
= 15 | BINARY_OP_PRECEDENCE(8),
148 RSHIFT
= 16 | BINARY_OP_PRECEDENCE(8),
149 URSHIFT
= 17 | BINARY_OP_PRECEDENCE(8),
150 PLUS
= 18 | BINARY_OP_PRECEDENCE(9) | UnaryOpTokenFlag
,
151 MINUS
= 19 | BINARY_OP_PRECEDENCE(9) | UnaryOpTokenFlag
,
152 TIMES
= 20 | BINARY_OP_PRECEDENCE(10),
153 DIVIDE
= 21 | BINARY_OP_PRECEDENCE(10),
154 MOD
= 22 | BINARY_OP_PRECEDENCE(10),
155 ERRORTOK
= 0 | ErrorTokenFlag
,
156 UNTERMINATED_IDENTIFIER_ESCAPE_ERRORTOK
= 0 | ErrorTokenFlag
| UnterminatedErrorTokenFlag
,
157 INVALID_IDENTIFIER_ESCAPE_ERRORTOK
= 1 | ErrorTokenFlag
,
158 UNTERMINATED_IDENTIFIER_UNICODE_ESCAPE_ERRORTOK
= 2 | ErrorTokenFlag
| UnterminatedErrorTokenFlag
,
159 INVALID_IDENTIFIER_UNICODE_ESCAPE_ERRORTOK
= 3 | ErrorTokenFlag
,
160 UNTERMINATED_MULTILINE_COMMENT_ERRORTOK
= 4 | ErrorTokenFlag
| UnterminatedErrorTokenFlag
,
161 UNTERMINATED_NUMERIC_LITERAL_ERRORTOK
= 5 | ErrorTokenFlag
| UnterminatedErrorTokenFlag
,
162 INVALID_OCTAL_NUMBER_ERRORTOK
= 6 | ErrorTokenFlag
| UnterminatedErrorTokenFlag
,
163 INVALID_NUMERIC_LITERAL_ERRORTOK
= 7 | ErrorTokenFlag
,
164 UNTERMINATED_STRING_LITERAL_ERRORTOK
= 8 | ErrorTokenFlag
| UnterminatedErrorTokenFlag
,
165 INVALID_STRING_LITERAL_ERRORTOK
= 9 | ErrorTokenFlag
,
166 INVALID_PRIVATE_NAME_ERRORTOK
= 10 | ErrorTokenFlag
,
167 INVALID_HEX_NUMBER_ERRORTOK
= 11 | ErrorTokenFlag
,
168 INVALID_BINARY_NUMBER_ERRORTOK
= 12 | ErrorTokenFlag
,
169 UNTERMINATED_TEMPLATE_LITERAL_ERRORTOK
= 13 | ErrorTokenFlag
| UnterminatedErrorTokenFlag
,
170 INVALID_TEMPLATE_LITERAL_ERRORTOK
= 14 | ErrorTokenFlag
,
173 struct JSTextPosition
{
174 JSTextPosition() : line(0), offset(0), lineStartOffset(0) { }
175 JSTextPosition(int _line
, int _offset
, int _lineStartOffset
) : line(_line
), offset(_offset
), lineStartOffset(_lineStartOffset
) { }
176 JSTextPosition(const JSTextPosition
& other
) : line(other
.line
), offset(other
.offset
), lineStartOffset(other
.lineStartOffset
) { }
178 JSTextPosition
operator+(int adjustment
) const { return JSTextPosition(line
, offset
+ adjustment
, lineStartOffset
); }
179 JSTextPosition
operator+(unsigned adjustment
) const { return *this + static_cast<int>(adjustment
); }
180 JSTextPosition
operator-(int adjustment
) const { return *this + (- adjustment
); }
181 JSTextPosition
operator-(unsigned adjustment
) const { return *this + (- static_cast<int>(adjustment
)); }
183 operator int() const { return offset
; }
194 uint32_t lineStartOffset
;
197 const Identifier
* ident
;
199 const Identifier
* cooked
;
200 const Identifier
* raw
;
205 struct JSTokenLocation
{
206 JSTokenLocation() : line(0), lineStartOffset(0), startOffset(0) { }
207 JSTokenLocation(const JSTokenLocation
& location
)
209 line
= location
.line
;
210 lineStartOffset
= location
.lineStartOffset
;
211 startOffset
= location
.startOffset
;
212 endOffset
= location
.endOffset
;
216 unsigned lineStartOffset
;
217 unsigned startOffset
;
224 JSTokenLocation m_location
;
225 JSTextPosition m_startPosition
;
226 JSTextPosition m_endPosition
;
231 #endif // ParserTokens_h