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