106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen/*
206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Copyright (C) 2010 Apple Inc. All rights reserved.
306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *
406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Redistribution and use in source and binary forms, with or without
506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * modification, are permitted provided that the following conditions
606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * are met:
706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * 1. Redistributions of source code must retain the above copyright
806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *    notice, this list of conditions and the following disclaimer.
906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * 2. Redistributions in binary form must reproduce the above copyright
1006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *    notice, this list of conditions and the following disclaimer in the
1106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *    documentation and/or other materials provided with the distribution.
1206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *
1306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * THE POSSIBILITY OF SUCH DAMAGE.
2406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen */
2506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
2606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#ifndef JSParser_h
2706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#define JSParser_h
2806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
2906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsennamespace JSC {
3006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
31a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochclass ExecState;
3268513a70bcd92384395513322f1b801e7bf9c729Steve Blockclass FunctionParameters;
3306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenclass Identifier;
34f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochclass JSGlobalData;
35e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkeclass SourceCode;
36e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
37e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkeenum {
38e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    UnaryOpTokenFlag = 64,
39967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    KeywordTokenFlag = 128,
40967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    BinaryOpTokenPrecedenceShift = 8,
41e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    BinaryOpTokenAllowsInPrecedenceAdditionalShift = 4,
42967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    BinaryOpTokenPrecedenceMask = 15 << BinaryOpTokenPrecedenceShift,
43e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke};
44e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
45e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#define BINARY_OP_PRECEDENCE(prec) (((prec) << BinaryOpTokenPrecedenceShift) | ((prec) << (BinaryOpTokenPrecedenceShift + BinaryOpTokenAllowsInPrecedenceAdditionalShift)))
46e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#define IN_OP_PRECEDENCE(prec) ((prec) << (BinaryOpTokenPrecedenceShift + BinaryOpTokenAllowsInPrecedenceAdditionalShift))
4706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
4806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenenum JSTokenType {
49967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    NULLTOKEN = KeywordTokenFlag,
50e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    TRUETOKEN,
51e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    FALSETOKEN,
52e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    BREAK,
53e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    CASE,
54e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    DEFAULT,
55e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    FOR,
56e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    NEW,
57e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    VAR,
58e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    CONSTTOKEN,
59e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    CONTINUE,
60e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    FUNCTION,
61e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    RETURN,
62e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    IF,
63e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    THISTOKEN,
64e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    DO,
65e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    WHILE,
66e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    SWITCH,
67e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    WITH,
68e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    RESERVED,
69e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    THROW,
70e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    TRY,
71e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    CATCH,
72e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    FINALLY,
73e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    DEBUGGER,
74e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    ELSE,
75967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    OPENBRACE = 0,
76e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    CLOSEBRACE,
77e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    OPENPAREN,
78e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    CLOSEPAREN,
79e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    OPENBRACKET,
80e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    CLOSEBRACKET,
81e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    COMMA,
82e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    QUESTION,
83e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    NUMBER,
84e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    IDENT,
85e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    STRING,
86e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    SEMICOLON,
87e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    COLON,
88e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    DOT,
89e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    ERRORTOK,
90e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    EOFTOK,
91e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    EQUAL,
92e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    PLUSEQUAL,
93e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    MINUSEQUAL,
94e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    MULTEQUAL,
95e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    DIVEQUAL,
96e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    LSHIFTEQUAL,
97e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    RSHIFTEQUAL,
98e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    URSHIFTEQUAL,
99e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    ANDEQUAL,
100e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    MODEQUAL,
101e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    XOREQUAL,
102e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    OREQUAL,
103e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    LastUntaggedToken,
104e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
105e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    // Begin tagged tokens
106e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    PLUSPLUS = 0 | UnaryOpTokenFlag,
107e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    MINUSMINUS = 1 | UnaryOpTokenFlag,
108e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    EXCLAMATION = 2 | UnaryOpTokenFlag,
109e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    TILDE = 3 | UnaryOpTokenFlag,
110e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    AUTOPLUSPLUS = 4 | UnaryOpTokenFlag,
111e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    AUTOMINUSMINUS = 5 | UnaryOpTokenFlag,
112967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    TYPEOF = 6 | UnaryOpTokenFlag | KeywordTokenFlag,
113967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    VOIDTOKEN = 7 | UnaryOpTokenFlag | KeywordTokenFlag,
114967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    DELETETOKEN = 8 | UnaryOpTokenFlag | KeywordTokenFlag,
115e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    OR = 0 | BINARY_OP_PRECEDENCE(1),
116e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    AND = 1 | BINARY_OP_PRECEDENCE(2),
117e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    BITOR = 2 | BINARY_OP_PRECEDENCE(3),
118e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    BITXOR = 3 | BINARY_OP_PRECEDENCE(4),
119e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    BITAND = 4 | BINARY_OP_PRECEDENCE(5),
120e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    EQEQ = 5 | BINARY_OP_PRECEDENCE(6),
121e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    NE = 6 | BINARY_OP_PRECEDENCE(6),
122e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    STREQ = 7 | BINARY_OP_PRECEDENCE(6),
123e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    STRNEQ = 8 | BINARY_OP_PRECEDENCE(6),
124e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    LT = 9 | BINARY_OP_PRECEDENCE(7),
125e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    GT = 10 | BINARY_OP_PRECEDENCE(7),
126e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    LE = 11 | BINARY_OP_PRECEDENCE(7),
127e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    GE = 12 | BINARY_OP_PRECEDENCE(7),
128967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    INSTANCEOF = 13 | BINARY_OP_PRECEDENCE(7) | KeywordTokenFlag,
129967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    INTOKEN = 14 | IN_OP_PRECEDENCE(7) | KeywordTokenFlag,
130e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    LSHIFT = 15 | BINARY_OP_PRECEDENCE(8),
131e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    RSHIFT = 16 | BINARY_OP_PRECEDENCE(8),
132e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    URSHIFT = 17 | BINARY_OP_PRECEDENCE(8),
133e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    PLUS = 18 | BINARY_OP_PRECEDENCE(9) | UnaryOpTokenFlag,
134e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    MINUS = 19 | BINARY_OP_PRECEDENCE(9) | UnaryOpTokenFlag,
135e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    TIMES = 20 | BINARY_OP_PRECEDENCE(10),
136e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    DIVIDE = 21 | BINARY_OP_PRECEDENCE(10),
137e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    MOD = 22 | BINARY_OP_PRECEDENCE(10)
13806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen};
13906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
14006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenunion JSTokenData {
14106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    int intValue;
14206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    double doubleValue;
14306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    const Identifier* ident;
14406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen};
14506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
14606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenstruct JSTokenInfo {
147e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    JSTokenInfo() : line(0) {}
148e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    int line;
149e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    int startOffset;
150e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    int endOffset;
15106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen};
152e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
15306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenstruct JSToken {
154e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    JSTokenType m_type;
15506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    JSTokenData m_data;
15606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    JSTokenInfo m_info;
15706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen};
15806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
159a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochenum JSParserStrictness { JSParseNormal, JSParseStrict };
160a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochenum JSParserMode { JSParseProgramCode, JSParseFunctionCode };
161a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochconst char* jsParse(JSGlobalData*, FunctionParameters*, JSParserStrictness, JSParserMode, const SourceCode*);
16306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
16406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif // JSParser_h
165