JSParser.h revision 967717af5423377c967781471ee106e2bb4e11c8
1/*
2 * Copyright (C) 2010 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 JSParser_h
27#define JSParser_h
28
29namespace JSC {
30
31class Identifier;
32class JSGlobalData;
33class SourceCode;
34
35enum {
36    UnaryOpTokenFlag = 64,
37    KeywordTokenFlag = 128,
38    BinaryOpTokenPrecedenceShift = 8,
39    BinaryOpTokenAllowsInPrecedenceAdditionalShift = 4,
40    BinaryOpTokenPrecedenceMask = 15 << BinaryOpTokenPrecedenceShift,
41};
42
43#define BINARY_OP_PRECEDENCE(prec) (((prec) << BinaryOpTokenPrecedenceShift) | ((prec) << (BinaryOpTokenPrecedenceShift + BinaryOpTokenAllowsInPrecedenceAdditionalShift)))
44#define IN_OP_PRECEDENCE(prec) ((prec) << (BinaryOpTokenPrecedenceShift + BinaryOpTokenAllowsInPrecedenceAdditionalShift))
45
46enum JSTokenType {
47    NULLTOKEN = KeywordTokenFlag,
48    TRUETOKEN,
49    FALSETOKEN,
50    BREAK,
51    CASE,
52    DEFAULT,
53    FOR,
54    NEW,
55    VAR,
56    CONSTTOKEN,
57    CONTINUE,
58    FUNCTION,
59    RETURN,
60    IF,
61    THISTOKEN,
62    DO,
63    WHILE,
64    SWITCH,
65    WITH,
66    RESERVED,
67    THROW,
68    TRY,
69    CATCH,
70    FINALLY,
71    DEBUGGER,
72    ELSE,
73    OPENBRACE = 0,
74    CLOSEBRACE,
75    OPENPAREN,
76    CLOSEPAREN,
77    OPENBRACKET,
78    CLOSEBRACKET,
79    COMMA,
80    QUESTION,
81    NUMBER,
82    IDENT,
83    STRING,
84    SEMICOLON,
85    COLON,
86    DOT,
87    ERRORTOK,
88    EOFTOK,
89    EQUAL,
90    PLUSEQUAL,
91    MINUSEQUAL,
92    MULTEQUAL,
93    DIVEQUAL,
94    LSHIFTEQUAL,
95    RSHIFTEQUAL,
96    URSHIFTEQUAL,
97    ANDEQUAL,
98    MODEQUAL,
99    XOREQUAL,
100    OREQUAL,
101    LastUntaggedToken,
102
103    // Begin tagged tokens
104    PLUSPLUS = 0 | UnaryOpTokenFlag,
105    MINUSMINUS = 1 | UnaryOpTokenFlag,
106    EXCLAMATION = 2 | UnaryOpTokenFlag,
107    TILDE = 3 | UnaryOpTokenFlag,
108    AUTOPLUSPLUS = 4 | UnaryOpTokenFlag,
109    AUTOMINUSMINUS = 5 | UnaryOpTokenFlag,
110    TYPEOF = 6 | UnaryOpTokenFlag | KeywordTokenFlag,
111    VOIDTOKEN = 7 | UnaryOpTokenFlag | KeywordTokenFlag,
112    DELETETOKEN = 8 | UnaryOpTokenFlag | KeywordTokenFlag,
113    OR = 0 | BINARY_OP_PRECEDENCE(1),
114    AND = 1 | BINARY_OP_PRECEDENCE(2),
115    BITOR = 2 | BINARY_OP_PRECEDENCE(3),
116    BITXOR = 3 | BINARY_OP_PRECEDENCE(4),
117    BITAND = 4 | BINARY_OP_PRECEDENCE(5),
118    EQEQ = 5 | BINARY_OP_PRECEDENCE(6),
119    NE = 6 | BINARY_OP_PRECEDENCE(6),
120    STREQ = 7 | BINARY_OP_PRECEDENCE(6),
121    STRNEQ = 8 | BINARY_OP_PRECEDENCE(6),
122    LT = 9 | BINARY_OP_PRECEDENCE(7),
123    GT = 10 | BINARY_OP_PRECEDENCE(7),
124    LE = 11 | BINARY_OP_PRECEDENCE(7),
125    GE = 12 | BINARY_OP_PRECEDENCE(7),
126    INSTANCEOF = 13 | BINARY_OP_PRECEDENCE(7) | KeywordTokenFlag,
127    INTOKEN = 14 | IN_OP_PRECEDENCE(7) | KeywordTokenFlag,
128    LSHIFT = 15 | BINARY_OP_PRECEDENCE(8),
129    RSHIFT = 16 | BINARY_OP_PRECEDENCE(8),
130    URSHIFT = 17 | BINARY_OP_PRECEDENCE(8),
131    PLUS = 18 | BINARY_OP_PRECEDENCE(9) | UnaryOpTokenFlag,
132    MINUS = 19 | BINARY_OP_PRECEDENCE(9) | UnaryOpTokenFlag,
133    TIMES = 20 | BINARY_OP_PRECEDENCE(10),
134    DIVIDE = 21 | BINARY_OP_PRECEDENCE(10),
135    MOD = 22 | BINARY_OP_PRECEDENCE(10)
136};
137
138union JSTokenData {
139    int intValue;
140    double doubleValue;
141    const Identifier* ident;
142};
143
144struct JSTokenInfo {
145    JSTokenInfo() : line(0) {}
146    int line;
147    int startOffset;
148    int endOffset;
149};
150
151struct JSToken {
152    JSTokenType m_type;
153    JSTokenData m_data;
154    JSTokenInfo m_info;
155};
156
157int jsParse(JSGlobalData*, const SourceCode*);
158}
159#endif // JSParser_h
160