Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members

statement.h

Go to the documentation of this file.
00001 // -*- mode: C++; c-file-style: "stroustrup"; c-basic-offset: 4; -*-
00002 
00003 /* libutap - Uppaal Timed Automata Parser.
00004    Copyright (C) 2002 Uppsala University and Aalborg University.
00005    
00006    This library is free software; you can redistribute it and/or
00007    modify it under the terms of the GNU Lesser General Public License
00008    as published by the Free Software Foundation; either version 2.1 of
00009    the License, or (at your option) any later version.
00010 
00011    This library is distributed in the hope that it will be useful, but
00012    WITHOUT ANY WARRANTY; without even the implied warranty of
00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014    Lesser General Public License for more details.
00015 
00016    You should have received a copy of the GNU Lesser General Public
00017    License along with this library; if not, write to the Free Software
00018    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00019    USA
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

Generated on Thu Nov 10 13:16:12 2005 for libutap by  doxygen 1.4.2