00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef UTAP_STATEMENT_H
00023 #define UTAP_STATEMENT_H
00024
00025 #include "utap/expression.h"
00026 #include "utap/symbols.h"
00027 #include "utap/system.h"
00028
00029 namespace UTAP
00030 {
00031 class StatementVisitor;
00032
00033 class Statement
00034 {
00035 public:
00036 virtual ~Statement() {};
00037 virtual int32_t accept(StatementVisitor *visitor) = 0;
00038 virtual bool returns() = 0;
00039 protected:
00040 Statement();
00041 };
00042
00043 class EmptyStatement: public Statement
00044 {
00045 public:
00046 EmptyStatement();
00047 virtual int32_t accept(StatementVisitor *visitor);
00048 virtual bool returns();
00049 };
00050
00051 class ExprStatement: public Statement
00052 {
00053 public:
00054 expression_t expr;
00055 ExprStatement(expression_t);
00056 virtual int32_t accept(StatementVisitor *visitor);
00057 virtual bool returns();
00058 };
00059
00060 class ForStatement: public Statement
00061 {
00062 public:
00063 expression_t init;
00064 expression_t cond;
00065 expression_t step;
00066 Statement *stat;
00067 ForStatement(expression_t, expression_t, expression_t, Statement*);
00068 virtual int32_t accept(StatementVisitor *visitor);
00069 virtual bool returns();
00070 };
00071
00075 class IterationStatement: public Statement
00076 {
00077 protected:
00078 frame_t frame;
00079 public:
00080 symbol_t symbol;
00081 Statement *stat;
00082 IterationStatement(symbol_t, frame_t, Statement *);
00083 frame_t getFrame() { return frame; }
00084 virtual int32_t accept(StatementVisitor *visitor);
00085 virtual bool returns();
00086 };
00087
00088 class WhileStatement: public Statement
00089 {
00090 public:
00091 expression_t cond;
00092 Statement *stat;
00093 WhileStatement(expression_t, Statement*);
00094 virtual int32_t accept(StatementVisitor *visitor);
00095 virtual bool returns();
00096 };
00097
00098 class DoWhileStatement: public Statement
00099 {
00100 public:
00101 Statement *stat;
00102 expression_t cond;
00103 DoWhileStatement(Statement*, expression_t);
00104 virtual int32_t accept(StatementVisitor *visitor);
00105 virtual bool returns();
00106 };
00107
00108 class BlockStatement: public Statement, public declarations_t
00109 {
00110 public:
00111 typedef std::vector<Statement *>::const_iterator const_iterator;
00112 typedef std::vector<Statement *>::iterator iterator;
00113 protected:
00114 std::vector<Statement*> stats;
00115 frame_t frame;
00116 public:
00117 BlockStatement(frame_t);
00118 virtual ~BlockStatement();
00119 virtual int32_t accept(StatementVisitor *visitor);
00120 virtual bool returns();
00121
00122 frame_t getFrame() { return frame; }
00123 void push_stat(Statement* stat);
00124 Statement* pop_stat();
00125 Statement* back();
00126 const_iterator begin() const;
00127 const_iterator end() const;
00128 iterator begin();
00129 iterator end();
00130 };
00131
00132 class SwitchStatement: public BlockStatement
00133 {
00134 public:
00135 expression_t cond;
00136 SwitchStatement(frame_t, expression_t);
00137 virtual int32_t accept(StatementVisitor *visitor);
00138 virtual bool returns();
00139 };
00140
00141 class CaseStatement: public BlockStatement
00142 {
00143 public:
00144 expression_t cond;
00145 CaseStatement(frame_t, expression_t);
00146 virtual int32_t accept(StatementVisitor *visitor);
00147 virtual bool returns();
00148 };
00149
00150 class DefaultStatement: public BlockStatement
00151 {
00152 public:
00153 DefaultStatement(frame_t);
00154 virtual int32_t accept(StatementVisitor *visitor);
00155 virtual bool returns();
00156 };
00157
00158 class IfStatement: public Statement
00159 {
00160 public:
00161 expression_t cond;
00162 Statement *trueCase;
00163 Statement *falseCase;
00164 IfStatement(expression_t, Statement*,
00165 Statement* falseStat=NULL);
00166 virtual int32_t accept(StatementVisitor *visitor);
00167 virtual bool returns();
00168 };
00169
00170 class BreakStatement: public Statement
00171 {
00172 public:
00173 BreakStatement();
00174 virtual int32_t accept(StatementVisitor *visitor);
00175 virtual bool returns();
00176 };
00177
00178 class ContinueStatement: public Statement
00179 {
00180 public:
00181 ContinueStatement();
00182 virtual int32_t accept(StatementVisitor *visitor);
00183 virtual bool returns();
00184 };
00185
00186 class ReturnStatement: public Statement
00187 {
00188 public:
00189 expression_t value;
00190 ReturnStatement();
00191 ReturnStatement(expression_t);
00192 virtual int32_t accept(StatementVisitor *visitor);
00193 virtual bool returns();
00194 };
00195
00196 class StatementVisitor
00197 {
00198 public:
00199 virtual ~StatementVisitor() {};
00200 virtual int32_t visitEmptyStatement(EmptyStatement *stat)=0;
00201 virtual int32_t visitExprStatement(ExprStatement *stat)=0;
00202 virtual int32_t visitForStatement(ForStatement *stat)=0;
00203 virtual int32_t visitIterationStatement(IterationStatement *stat)=0;
00204 virtual int32_t visitWhileStatement(WhileStatement *stat)=0;
00205 virtual int32_t visitDoWhileStatement(DoWhileStatement *stat)=0;
00206 virtual int32_t visitBlockStatement(BlockStatement *stat)=0;
00207 virtual int32_t visitSwitchStatement(SwitchStatement *stat)=0;
00208 virtual int32_t visitCaseStatement(CaseStatement *stat)=0;
00209 virtual int32_t visitDefaultStatement(DefaultStatement *stat)=0;
00210 virtual int32_t visitIfStatement(IfStatement *stat)=0;
00211 virtual int32_t visitBreakStatement(BreakStatement *stat)=0;
00212 virtual int32_t visitContinueStatement(ContinueStatement *stat)=0;
00213 virtual int32_t visitReturnStatement(ReturnStatement *stat)=0;
00214 };
00215
00216 class AbstractStatementVisitor : public StatementVisitor
00217 {
00218 protected:
00219 virtual int32_t visitStatement(Statement *stat);
00220 public:
00221 virtual int32_t visitEmptyStatement(EmptyStatement *stat);
00222 virtual int32_t visitExprStatement(ExprStatement *stat);
00223 virtual int32_t visitForStatement(ForStatement *stat);
00224 virtual int32_t visitIterationStatement(IterationStatement *stat);
00225 virtual int32_t visitWhileStatement(WhileStatement *stat);
00226 virtual int32_t visitDoWhileStatement(DoWhileStatement *stat);
00227 virtual int32_t visitBlockStatement(BlockStatement *stat);
00228 virtual int32_t visitSwitchStatement(SwitchStatement *stat);
00229 virtual int32_t visitCaseStatement(CaseStatement *stat);
00230 virtual int32_t visitDefaultStatement(DefaultStatement *stat);
00231 virtual int32_t visitIfStatement(IfStatement *stat);
00232 virtual int32_t visitBreakStatement(BreakStatement *stat);
00233 virtual int32_t visitContinueStatement(ContinueStatement *stat);
00234 virtual int32_t visitReturnStatement(ReturnStatement *stat);
00235 };
00236
00237 class ExpressionVisitor : public AbstractStatementVisitor
00238 {
00239 protected:
00240 virtual void visitExpression(expression_t) = 0;
00241 public:
00242 virtual int32_t visitExprStatement(ExprStatement *stat);
00243 virtual int32_t visitForStatement(ForStatement *stat);
00244 virtual int32_t visitWhileStatement(WhileStatement *stat);
00245 virtual int32_t visitDoWhileStatement(DoWhileStatement *stat);
00246 virtual int32_t visitBlockStatement(BlockStatement *stat);
00247 virtual int32_t visitSwitchStatement(SwitchStatement *stat);
00248 virtual int32_t visitCaseStatement(CaseStatement *stat);
00249 virtual int32_t visitDefaultStatement(DefaultStatement *stat);
00250 virtual int32_t visitIfStatement(IfStatement *stat);
00251 virtual int32_t visitReturnStatement(ReturnStatement *stat);
00252 };
00253
00254 class CollectChangesVisitor : public ExpressionVisitor
00255 {
00256 protected:
00257 virtual void visitExpression(expression_t);
00258 std::set<symbol_t> &changes;
00259 public:
00260 CollectChangesVisitor(std::set<symbol_t> &);
00261 };
00262
00263 class CollectDependenciesVisitor : public ExpressionVisitor
00264 {
00265 protected:
00266 virtual void visitExpression(expression_t);
00267 std::set<symbol_t> &dependencies;
00268 public:
00269 CollectDependenciesVisitor(std::set<symbol_t> &);
00270 };
00271
00272 }
00273 #endif