Windows build fix.
[WebKit.git] / Source / JavaScriptCore / parser / SyntaxChecker.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 SyntaxChecker_h
27 #define SyntaxChecker_h
28
29 #include <yarr/YarrSyntaxChecker.h>
30
31 namespace JSC {
32 class SyntaxChecker {
33 public:
34     SyntaxChecker(JSGlobalData* , Lexer*)
35         : m_topBinaryExpr(0)
36     {
37     }
38
39     typedef SyntaxChecker FunctionBodyBuilder;
40     enum { NoneExpr = 0,
41         ResolveEvalExpr, ResolveExpr, NumberExpr, StringExpr,
42         ThisExpr, NullExpr, BoolExpr, RegExpExpr, ObjectLiteralExpr,
43         FunctionExpr, BracketExpr, DotExpr, CallExpr,
44         NewExpr, PreExpr, PostExpr, UnaryExpr, BinaryExpr,
45         ConditionalExpr, AssignmentExpr, TypeofExpr,
46         DeleteExpr, ArrayLiteralExpr };
47     typedef int ExpressionType;
48
49     typedef ExpressionType Expression;
50     typedef int SourceElements;
51     typedef int Arguments;
52     typedef ExpressionType Comma;
53     struct Property {
54         ALWAYS_INLINE Property(void* = 0)
55             : type((PropertyNode::Type)0)
56         {
57         }
58         ALWAYS_INLINE Property(const Identifier* ident, PropertyNode::Type ty)
59         : name(ident)
60         , type(ty)
61         {
62         }
63         ALWAYS_INLINE Property(PropertyNode::Type ty)
64             : name(0)
65             , type(ty)
66         {
67         }
68         ALWAYS_INLINE bool operator!() { return !type; }
69         const Identifier* name;
70         PropertyNode::Type type;
71     };
72     typedef int PropertyList;
73     typedef int ElementList;
74     typedef int ArgumentsList;
75     typedef int FormalParameterList;
76     typedef int FunctionBody;
77     typedef int Statement;
78     typedef int ClauseList;
79     typedef int Clause;
80     typedef int ConstDeclList;
81     typedef int BinaryOperand;
82     
83     static const bool CreatesAST = false;
84     static const bool NeedsFreeVariableInfo = false;
85
86     int createSourceElements() { return 1; }
87     ExpressionType makeFunctionCallNode(int, int, int, int, int) { return CallExpr; }
88     void appendToComma(ExpressionType& base, ExpressionType right) { base = right; }
89     ExpressionType createCommaExpr(ExpressionType, ExpressionType right) { return right; }
90     ExpressionType makeAssignNode(ExpressionType, Operator, ExpressionType, bool, bool, int, int, int) { return AssignmentExpr; }
91     ExpressionType makePrefixNode(ExpressionType, Operator, int, int, int) { return PreExpr; }
92     ExpressionType makePostfixNode(ExpressionType, Operator, int, int, int) { return PostExpr; }
93     ExpressionType makeTypeOfNode(ExpressionType) { return TypeofExpr; }
94     ExpressionType makeDeleteNode(ExpressionType, int, int, int) { return DeleteExpr; }
95     ExpressionType makeNegateNode(ExpressionType) { return UnaryExpr; }
96     ExpressionType makeBitwiseNotNode(ExpressionType) { return UnaryExpr; }
97     ExpressionType createLogicalNot(ExpressionType) { return UnaryExpr; }
98     ExpressionType createUnaryPlus(ExpressionType) { return UnaryExpr; }
99     ExpressionType createVoid(ExpressionType) { return UnaryExpr; }
100     ExpressionType thisExpr() { return ThisExpr; }
101     ExpressionType createResolve(const Identifier*, int) { return ResolveExpr; }
102     ExpressionType createObjectLiteral() { return ObjectLiteralExpr; }
103     ExpressionType createObjectLiteral(int) { return ObjectLiteralExpr; }
104     ExpressionType createArray(int) { return ArrayLiteralExpr; }
105     ExpressionType createArray(int, int) { return ArrayLiteralExpr; }
106     ExpressionType createNumberExpr(double) { return NumberExpr; }
107     ExpressionType createString(const Identifier*) { return StringExpr; }
108     ExpressionType createBoolean(bool) { return BoolExpr; }
109     ExpressionType createNull() { return NullExpr; }
110     ExpressionType createBracketAccess(ExpressionType, ExpressionType, bool, int, int, int) { return BracketExpr; }
111     ExpressionType createDotAccess(ExpressionType, const Identifier&, int, int, int) { return DotExpr; }
112     ExpressionType createRegExp(const Identifier& pattern, const Identifier&, int) { return Yarr::checkSyntax(pattern.ustring()) ? 0 : RegExpExpr; }
113     ExpressionType createNewExpr(ExpressionType, int, int, int, int) { return NewExpr; }
114     ExpressionType createNewExpr(ExpressionType, int, int) { return NewExpr; }
115     ExpressionType createConditionalExpr(ExpressionType, ExpressionType, ExpressionType) { return ConditionalExpr; }
116     ExpressionType createAssignResolve(const Identifier&, ExpressionType, bool, int, int, int) { return AssignmentExpr; }
117     ExpressionType createFunctionExpr(const Identifier*, int, int, int, int, int, int) { return FunctionExpr; }
118     int createFunctionBody(bool) { return 1; }
119     int createArguments() { return 1; }
120     int createArguments(int) { return 1; }
121     int createArgumentsList(int) { return 1; }
122     int createArgumentsList(int, int) { return 1; }
123     template <bool complete> Property createProperty(const Identifier* name, int, PropertyNode::Type type)
124     {
125         ASSERT(name);
126         if (!complete)
127             return Property(type);
128         return Property(name, type);
129     }
130     template <bool complete> Property createProperty(JSGlobalData* globalData, double name, int, PropertyNode::Type type)
131     {
132         if (!complete)
133             return Property(type);
134         return Property(&globalData->parser->arena().identifierArena().makeNumericIdentifier(globalData, name), type);
135     }
136     int createPropertyList(Property) { return 1; }
137     int createPropertyList(Property, int) { return 1; }
138     int createElementList(int, int) { return 1; }
139     int createElementList(int, int, int) { return 1; }
140     int createFormalParameterList(const Identifier&) { return 1; }
141     int createFormalParameterList(int, const Identifier&) { return 1; }
142     int createClause(int, int) { return 1; }
143     int createClauseList(int) { return 1; }
144     int createClauseList(int, int) { return 1; }
145     void setUsesArguments(int) { }
146     int createFuncDeclStatement(const Identifier*, int, int, int, int, int, int) { return 1; }
147     int createBlockStatement(int, int, int) { return 1; }
148     int createExprStatement(int, int, int) { return 1; }
149     int createIfStatement(int, int, int, int) { return 1; }
150     int createIfStatement(int, int, int, int, int) { return 1; }
151     int createForLoop(int, int, int, int, bool, int, int) { return 1; }
152     int createForInLoop(const Identifier*, int, int, int, int, int, int, int, int, int, int) { return 1; }
153     int createForInLoop(int, int, int, int, int, int, int, int) { return 1; }
154     int createEmptyStatement() { return 1; }
155     int createVarStatement(int, int, int) { return 1; }
156     int createReturnStatement(int, int, int, int, int) { return 1; }
157     int createBreakStatement(int, int, int, int) { return 1; }
158     int createBreakStatement(const Identifier*, int, int, int, int) { return 1; }
159     int createContinueStatement(int, int, int, int) { return 1; }
160     int createContinueStatement(const Identifier*, int, int, int, int) { return 1; }
161     int createTryStatement(int, const Identifier*, bool, int, int, int, int) { return 1; }
162     int createSwitchStatement(int, int, int, int, int, int) { return 1; }
163     int createWhileStatement(int, int, int, int) { return 1; }
164     int createWithStatement(int, int, int, int, int, int) { return 1; }
165     int createDoWhileStatement(int, int, int, int) { return 1; }
166     int createLabelStatement(const Identifier*, int, int, int) { return 1; }
167     int createThrowStatement(int, int, int, int, int) { return 1; }
168     int createDebugger(int, int) { return 1; }
169     int createConstStatement(int, int, int) { return 1; }
170     int appendConstDecl(int, const Identifier*, int) { return 1; }
171     template <bool strict> Property createGetterOrSetterProperty(PropertyNode::Type type, const Identifier* name, int, int, int, int, int, int)
172     {
173         ASSERT(name);
174         if (!strict)
175             return Property(type);
176         return Property(name, type);
177     }
178
179     void appendStatement(int, int) { }
180     void addVar(const Identifier*, bool) { }
181     int combineCommaNodes(int, int) { return 1; }
182     int evalCount() const { return 0; }
183     void appendBinaryExpressionInfo(int& operandStackDepth, int expr, int, int, int, bool)
184     {
185         if (!m_topBinaryExpr)
186             m_topBinaryExpr = expr;
187         else
188             m_topBinaryExpr = BinaryExpr;
189         operandStackDepth++;
190     }
191     
192     // Logic to handle datastructures used during parsing of binary expressions
193     void operatorStackPop(int& operatorStackDepth) { operatorStackDepth--; }
194     bool operatorStackHasHigherPrecedence(int&, int) { return true; }
195     BinaryOperand getFromOperandStack(int) { return m_topBinaryExpr; }
196     void shrinkOperandStackBy(int& operandStackDepth, int amount) { operandStackDepth -= amount; }
197     void appendBinaryOperation(int& operandStackDepth, int&, BinaryOperand, BinaryOperand) { operandStackDepth++; }
198     void operatorStackAppend(int& operatorStackDepth, int, int) { operatorStackDepth++; }
199     int popOperandStack(int&) { int res = m_topBinaryExpr; m_topBinaryExpr = 0; return res; }
200     
201     void appendUnaryToken(int& stackDepth, int tok, int) { stackDepth = 1; m_topUnaryToken = tok; }
202     int unaryTokenStackLastType(int&) { return m_topUnaryToken; }
203     int unaryTokenStackLastStart(int&) { return 0; }
204     void unaryTokenStackRemoveLast(int& stackDepth) { stackDepth = 0; }
205     
206     void assignmentStackAppend(int, int, int, int, int, Operator) { }
207     int createAssignment(int, int, int, int, int) { ASSERT_NOT_REACHED(); return 1; }
208     const Identifier& getName(const Property& property) const { ASSERT(property.name); return *property.name; }
209     PropertyNode::Type getType(const Property& property) const { return property.type; }
210     bool isResolve(ExpressionType expr) const { return expr == ResolveExpr || expr == ResolveEvalExpr; }
211     
212 private:
213     int m_topBinaryExpr;
214     int m_topUnaryToken;
215 };
216
217 }
218
219 #endif