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         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

Generated on Sat Apr 29 21:02:14 2006 for libutap by  doxygen 1.4.2