Re-add support for |if|, |continue|, |break|.
2 * Copyright (C) 2012 David Anderson
4 * This file is part of SourcePawn.
6 * SourcePawn is free software: you can redistribute it and/or modify it under
7 * the terms of the GNU General Public License as published by the Free
8 * Software Foundation, either version 3 of the License, or (at your option)
11 * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along with
16 * SourcePawn. If not, see http://www.gnu.org/licenses/.
18 #ifndef _include_sp2_sema_h_
19 #define _include_sp2_sema_h_
24 #include "BytecodeEmitter.h"
28 // Semantic analysis occurs after all names and types have been bound. It
29 // performs the important task of validating the semantics and type safety
32 // The semantic analysis phase also produces bytecode. This occurs on a
33 // statement-by-statement basis. The result of analyzing an expression is a
34 // tree of operations which is then flattened.
35 class SemanticAnalysis : public AstVisitor
38 SemanticAnalysis(Zone *zone, CompileContext &cc, TranslationUnit *unit);
43 SemanticAnalysis(SemanticAnalysis *parent, Handle<FunctionType> fun);
44 Function *compile(FunctionStatement *stmt);
47 void visitFunctionStatement(FunctionStatement *node);
48 void visitBlockStatement(BlockStatement *node);
49 void visitExpressionStatement(ExpressionStatement *node);
50 void visitReturnStatement(ReturnStatement *node);
52 void visitCallExpression(CallExpression *node);
53 void visitNameProxy(NameProxy *name);
54 void visitIntegerLiteral(IntegerLiteral *node);
55 void visitFloatLiteral(FloatLiteral *node);
56 void visitVariableDeclaration(VariableDeclaration *node);
57 void visitForStatement(ForStatement *node);
58 void visitWhileStatement(WhileStatement *node);
59 void visitAssignment(Assignment *node);
60 void visitBinaryExpression(BinaryExpression *node);
61 void visitBreakStatement(BreakStatement *node);
62 void visitContinueStatement(ContinueStatement *node);
63 void visitIfStatement(IfStatement *node);
65 void visitFunctionTypeStatement(FunctionTypeStatement *node);
66 void visitImportStatement(ImportStatement *node);
67 void visitExpressionStatement(ExpressionStatement *node);
68 void visitEnumStatement(EnumStatement *node);
69 void visitStructureStatement(StructureStatement *node);
70 void visitSwitchStatement(SwitchStatement *node);
72 void visitBinaryExpression(BinaryExpression *node);
73 void visitCallExpression(CallExpression *node);
74 void visitIndexExpression(IndexExpression *node);
75 void visitStringLiteral(StringLiteral *node);
76 void visitIncDecExpression(IncDecExpression *node);
77 void visitUnaryExpression(UnaryExpression *node);
78 void visitTernaryExpression(TernaryExpression *node);
79 void visitBooleanLiteral(BooleanLiteral *node);
80 void visitFieldExpression(FieldExpression *node);
81 void visitArrayLiteral(ArrayLiteral *node);
85 bool checkArgumentCount(Handle<FunctionType> type, unsigned actual);
94 void visitForTest(Expression *expr,
95 BytecodeEmitter::Label *trueBranch,
96 BytecodeEmitter::Label *falseBranch,
97 BytecodeEmitter::Label *fallthrough);
98 void set(VariableSymbol *sym);
99 HIR *eval(Expression *expr);
100 HIR *binary(TokenKind token, HIR *left, HIR *right);
101 HIR *coerce(HIR *from, Handle<Type> to, CoercionKind kind);
102 Type *coercionType(TokenKind token, HIR *left, HIR *right);
103 HLValue *lvalue(Expression *expr);
104 void discharge(HIR *hir);
107 // Used to target break/catch statements.
111 BytecodeEmitter::Label *bk_;
112 BytecodeEmitter::Label *ct_;
117 LoopScope(Scope *scope, BytecodeEmitter::Label *bk, BytecodeEmitter::Label *ct,
133 BytecodeEmitter::Label *break_() {
136 BytecodeEmitter::Label *continue_() {
146 PoolAllocator &pool_;
148 TranslationUnit *unit_;
151 BytecodeEmitter emitter_;
152 ScopedRoot<Module> module_;
153 ScopedRoot<FunctionType> fun_;
159 #endif // _include_sp2_sema_h_