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