statement.h

Go to the documentation of this file.
00001 // -*- mode: C++; c-file-style: "stroustrup"; c-basic-offset: 4; indent-tabs-mode: nil; -*-
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         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

Generated on Thu Feb 22 14:46:52 2007 for libutap by  doxygen 1.4.7