initial import
[vuplus_webkit] / Source / JavaScriptCore / parser / JSParser.h
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
29 #include "UString.h"
30
31 namespace JSC {
32
33 class ExecState;
34 class FunctionParameters;
35 class Identifier;
36 class JSGlobalData;
37 class SourceCode;
38
39 enum {
40     UnaryOpTokenFlag = 64,
41     KeywordTokenFlag = 128,
42     BinaryOpTokenPrecedenceShift = 8,
43     BinaryOpTokenAllowsInPrecedenceAdditionalShift = 4,
44     BinaryOpTokenPrecedenceMask = 15 << BinaryOpTokenPrecedenceShift,
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     OPENBRACE = 0,
79     CLOSEBRACE,
80     OPENPAREN,
81     CLOSEPAREN,
82     OPENBRACKET,
83     CLOSEBRACKET,
84     COMMA,
85     QUESTION,
86     NUMBER,
87     IDENT,
88     STRING,
89     SEMICOLON,
90     COLON,
91     DOT,
92     ERRORTOK,
93     EOFTOK,
94     EQUAL,
95     PLUSEQUAL,
96     MINUSEQUAL,
97     MULTEQUAL,
98     DIVEQUAL,
99     LSHIFTEQUAL,
100     RSHIFTEQUAL,
101     URSHIFTEQUAL,
102     ANDEQUAL,
103     MODEQUAL,
104     XOREQUAL,
105     OREQUAL,
106     LastUntaggedToken,
107
108     // Begin tagged tokens
109     PLUSPLUS = 0 | UnaryOpTokenFlag,
110     MINUSMINUS = 1 | UnaryOpTokenFlag,
111     EXCLAMATION = 2 | UnaryOpTokenFlag,
112     TILDE = 3 | UnaryOpTokenFlag,
113     AUTOPLUSPLUS = 4 | UnaryOpTokenFlag,
114     AUTOMINUSMINUS = 5 | UnaryOpTokenFlag,
115     TYPEOF = 6 | UnaryOpTokenFlag | KeywordTokenFlag,
116     VOIDTOKEN = 7 | UnaryOpTokenFlag | KeywordTokenFlag,
117     DELETETOKEN = 8 | UnaryOpTokenFlag | KeywordTokenFlag,
118     OR = 0 | BINARY_OP_PRECEDENCE(1),
119     AND = 1 | BINARY_OP_PRECEDENCE(2),
120     BITOR = 2 | BINARY_OP_PRECEDENCE(3),
121     BITXOR = 3 | BINARY_OP_PRECEDENCE(4),
122     BITAND = 4 | BINARY_OP_PRECEDENCE(5),
123     EQEQ = 5 | BINARY_OP_PRECEDENCE(6),
124     NE = 6 | BINARY_OP_PRECEDENCE(6),
125     STREQ = 7 | BINARY_OP_PRECEDENCE(6),
126     STRNEQ = 8 | BINARY_OP_PRECEDENCE(6),
127     LT = 9 | BINARY_OP_PRECEDENCE(7),
128     GT = 10 | BINARY_OP_PRECEDENCE(7),
129     LE = 11 | BINARY_OP_PRECEDENCE(7),
130     GE = 12 | BINARY_OP_PRECEDENCE(7),
131     INSTANCEOF = 13 | BINARY_OP_PRECEDENCE(7) | KeywordTokenFlag,
132     INTOKEN = 14 | IN_OP_PRECEDENCE(7) | KeywordTokenFlag,
133     LSHIFT = 15 | BINARY_OP_PRECEDENCE(8),
134     RSHIFT = 16 | BINARY_OP_PRECEDENCE(8),
135     URSHIFT = 17 | BINARY_OP_PRECEDENCE(8),
136     PLUS = 18 | BINARY_OP_PRECEDENCE(9) | UnaryOpTokenFlag,
137     MINUS = 19 | BINARY_OP_PRECEDENCE(9) | UnaryOpTokenFlag,
138     TIMES = 20 | BINARY_OP_PRECEDENCE(10),
139     DIVIDE = 21 | BINARY_OP_PRECEDENCE(10),
140     MOD = 22 | BINARY_OP_PRECEDENCE(10)
141 };
142
143 union JSTokenData {
144     int intValue;
145     double doubleValue;
146     const Identifier* ident;
147 };
148
149 struct JSTokenInfo {
150     JSTokenInfo() : line(0) {}
151     int line;
152     int startOffset;
153     int endOffset;
154 };
155
156 struct JSToken {
157     JSTokenType m_type;
158     JSTokenData m_data;
159     JSTokenInfo m_info;
160 };
161
162 enum JSParserStrictness { JSParseNormal, JSParseStrict };
163 enum JSParserMode { JSParseProgramCode, JSParseFunctionCode };
164
165 UString jsParse(JSGlobalData*, FunctionParameters*, JSParserStrictness, JSParserMode, const SourceCode*);
166 }
167 #endif // JSParser_h