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 AssertStatement: public Statement
00061 {
00062 public:
00063 expression_t expr;
00064 AssertStatement(expression_t);
00065 virtual int32_t accept(StatementVisitor *visitor);
00066 virtual bool returns();
00067 };
00068
00069 class ForStatement: public Statement
00070 {
00071 public:
00072 expression_t init;
00073 expression_t cond;
00074 expression_t step;
00075 Statement *stat;
00076 ForStatement(expression_t, expression_t, expression_t, Statement*);
00077 virtual int32_t accept(StatementVisitor *visitor);
00078 virtual bool returns();
00079 };
00080
00084 class IterationStatement: public Statement
00085 {
00086 protected:
00087 frame_t frame;
00088 public:
00089 symbol_t symbol;
00090 Statement *stat;
00091 IterationStatement(symbol_t, frame_t, Statement *);
00092 frame_t getFrame() { return frame; }
00093 virtual int32_t accept(StatementVisitor *visitor);
00094 virtual bool returns();
00095 };
00096
00097 class WhileStatement: public Statement
00098 {
00099 public:
00100 expression_t cond;
00101 Statement *stat;
00102 WhileStatement(expression_t, Statement*);
00103 virtual int32_t accept(StatementVisitor *visitor);
00104 virtual bool returns();
00105 };
00106
00107 class DoWhileStatement: public Statement
00108 {
00109 public:
00110 Statement *stat;
00111 expression_t cond;
00112 DoWhileStatement(Statement*, expression_t);
00113 virtual int32_t accept(StatementVisitor *visitor);
00114 virtual bool returns();
00115 };
00116
00117 class BlockStatement: public Statement, public declarations_t
00118 {
00119 public:
00120 typedef std::vector<Statement *>::const_iterator const_iterator;
00121 typedef std::vector<Statement *>::iterator iterator;
00122 protected:
00123 std::vector<Statement*> stats;
00124 frame_t frame;
00125 public:
00126 BlockStatement(frame_t);
00127 virtual ~BlockStatement();
00128 virtual int32_t accept(StatementVisitor *visitor);
00129 virtual bool returns();
00130
00131 frame_t getFrame() { return frame; }
00132 void push_stat(Statement* stat);
00133 Statement* pop_stat();
00134 Statement* back();
00135 const_iterator begin() const;
00136 const_iterator end() const;
00137 iterator begin();
00138 iterator end();
00139 };
00140
00141 class SwitchStatement: public BlockStatement
00142 {
00143 public:
00144 expression_t cond;
00145 SwitchStatement(frame_t, expression_t);
00146 virtual int32_t accept(StatementVisitor *visitor);
00147 virtual bool returns();
00148 };
00149
00150 class CaseStatement: public BlockStatement
00151 {
00152 public:
00153 expression_t cond;
00154 CaseStatement(frame_t, expression_t);
00155 virtual int32_t accept(StatementVisitor *visitor);
00156 virtual bool returns();
00157 };
00158
00159 class DefaultStatement: public BlockStatement
00160 {
00161 public:
00162 DefaultStatement(frame_t);
00163 virtual int32_t accept(StatementVisitor *visitor);
00164 virtual bool returns();
00165 };
00166
00167 class IfStatement: public Statement
00168 {
00169 public:
00170 expression_t cond;
00171 Statement *trueCase;
00172 Statement *falseCase;
00173 IfStatement(expression_t, Statement*,
00174 Statement* falseStat=NULL);
00175 virtual int32_t accept(StatementVisitor *visitor);
00176 virtual bool returns();
00177 };
00178
00179 class BreakStatement: public Statement
00180 {
00181 public:
00182 BreakStatement();
00183 virtual int32_t accept(StatementVisitor *visitor);
00184 virtual bool returns();
00185 };
00186
00187 class ContinueStatement: public Statement
00188 {
00189 public:
00190 ContinueStatement();
00191 virtual int32_t accept(StatementVisitor *visitor);
00192 virtual bool returns();
00193 };
00194
00195 class ReturnStatement: public Statement
00196 {
00197 public:
00198 expression_t value;
00199 ReturnStatement();
00200 ReturnStatement(expression_t);
00201 virtual int32_t accept(StatementVisitor *visitor);
00202 virtual bool returns();
00203 };
00204
00205 class StatementVisitor
00206 {
00207 public:
00208 virtual ~StatementVisitor() {};
00209 virtual int32_t visitEmptyStatement(EmptyStatement *stat)=0;
00210 virtual int32_t visitExprStatement(ExprStatement *stat)=0;
00211 virtual int32_t visitAssertStatement(AssertStatement *stat)=0;
00212 virtual int32_t visitForStatement(ForStatement *stat)=0;
00213 virtual int32_t visitIterationStatement(IterationStatement *stat)=0;
00214 virtual int32_t visitWhileStatement(WhileStatement *stat)=0;
00215 virtual int32_t visitDoWhileStatement(DoWhileStatement *stat)=0;
00216 virtual int32_t visitBlockStatement(BlockStatement *stat)=0;
00217 virtual int32_t visitSwitchStatement(SwitchStatement *stat)=0;
00218 virtual int32_t visitCaseStatement(CaseStatement *stat)=0;
00219 virtual int32_t visitDefaultStatement(DefaultStatement *stat)=0;
00220 virtual int32_t visitIfStatement(IfStatement *stat)=0;
00221 virtual int32_t visitBreakStatement(BreakStatement *stat)=0;
00222 virtual int32_t visitContinueStatement(ContinueStatement *stat)=0;
00223 virtual int32_t visitReturnStatement(ReturnStatement *stat)=0;
00224 };
00225
00226 class AbstractStatementVisitor : public StatementVisitor
00227 {
00228 protected:
00229 virtual int32_t visitStatement(Statement *stat);
00230 public:
00231 virtual int32_t visitEmptyStatement(EmptyStatement *stat);
00232 virtual int32_t visitExprStatement(ExprStatement *stat);
00233 virtual int32_t visitAssertStatement(AssertStatement *stat);
00234 virtual int32_t visitForStatement(ForStatement *stat);
00235 virtual int32_t visitIterationStatement(IterationStatement *stat);
00236 virtual int32_t visitWhileStatement(WhileStatement *stat);
00237 virtual int32_t visitDoWhileStatement(DoWhileStatement *stat);
00238 virtual int32_t visitBlockStatement(BlockStatement *stat);
00239 virtual int32_t visitSwitchStatement(SwitchStatement *stat);
00240 virtual int32_t visitCaseStatement(CaseStatement *stat);
00241 virtual int32_t visitDefaultStatement(DefaultStatement *stat);
00242 virtual int32_t visitIfStatement(IfStatement *stat);
00243 virtual int32_t visitBreakStatement(BreakStatement *stat);
00244 virtual int32_t visitContinueStatement(ContinueStatement *stat);
00245 virtual int32_t visitReturnStatement(ReturnStatement *stat);
00246 };
00247
00248 class ExpressionVisitor : public AbstractStatementVisitor
00249 {
00250 protected:
00251 virtual void visitExpression(expression_t) = 0;
00252 public:
00253 virtual int32_t visitExprStatement(ExprStatement *stat);
00254 virtual int32_t visitAssertStatement(AssertStatement *stat);
00255 virtual int32_t visitForStatement(ForStatement *stat);
00256 virtual int32_t visitWhileStatement(WhileStatement *stat);
00257 virtual int32_t visitDoWhileStatement(DoWhileStatement *stat);
00258 virtual int32_t visitBlockStatement(BlockStatement *stat);
00259 virtual int32_t visitSwitchStatement(SwitchStatement *stat);
00260 virtual int32_t visitCaseStatement(CaseStatement *stat);
00261 virtual int32_t visitDefaultStatement(DefaultStatement *stat);
00262 virtual int32_t visitIfStatement(IfStatement *stat);
00263 virtual int32_t visitReturnStatement(ReturnStatement *stat);
00264 };
00265
00266 class CollectChangesVisitor : public ExpressionVisitor
00267 {
00268 protected:
00269 virtual void visitExpression(expression_t);
00270 std::set<symbol_t> &changes;
00271 public:
00272 CollectChangesVisitor(std::set<symbol_t> &);
00273 };
00274
00275 class CollectDependenciesVisitor : public ExpressionVisitor
00276 {
00277 protected:
00278 virtual void visitExpression(expression_t);
00279 std::set<symbol_t> &dependencies;
00280 public:
00281 CollectDependenciesVisitor(std::set<symbol_t> &);
00282 };
00283
00284 }
00285 #endif