| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- #ifndef STMTNODE_H
- #define STMTNODE_H
- #include "node.h"
- struct StmtNode : public Node{
- int pos; //offset in source stream
- StmtNode():pos(-1){}
- void debug( int pos,Codegen *g );
- virtual void semant( Environ *e ){}
- virtual void translate( Codegen *g ){}
- };
- struct StmtSeqNode : public Node{
- string file;
- vector<StmtNode*> stmts;
- StmtSeqNode( const string &f ):file(f){}
- ~StmtSeqNode(){ for( ;stmts.size();stmts.pop_back() ) delete stmts.back(); }
- void semant( Environ *e );
- void translate( Codegen *g );
- void push_back( StmtNode *s ){ stmts.push_back( s ); }
- int size(){ return stmts.size(); }
- static void reset( const string &file,const string &lab );
- };
- #include "exprnode.h"
- #include "declnode.h"
- struct IncludeNode : public StmtNode{
- string file,label;
- StmtSeqNode *stmts;
- IncludeNode( const string &t,StmtSeqNode *ss ):file(t),stmts(ss){}
- ~IncludeNode(){ delete stmts; }
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct DeclStmtNode : public StmtNode{
- DeclNode *decl;
- DeclStmtNode( DeclNode *d ):decl(d){ pos=d->pos; }
- ~DeclStmtNode(){ delete decl; }
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct DimNode : public StmtNode{
- string ident,tag;
- ExprSeqNode *exprs;
- ArrayType *sem_type;
- Decl *sem_decl;
- DimNode( const string &i,const string &t,ExprSeqNode *e ):ident(i),tag(t),exprs(e){}
- ~DimNode(){ delete exprs; }
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct AssNode : public StmtNode{
- VarNode *var;
- ExprNode *expr;
- AssNode( VarNode *var,ExprNode *expr ):var(var),expr(expr){}
- ~AssNode(){ delete var;delete expr; }
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct ExprStmtNode : public StmtNode{
- ExprNode *expr;
- ExprStmtNode( ExprNode *e ):expr(e){}
- ~ExprStmtNode(){ delete expr; }
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct LabelNode : public StmtNode{
- string ident;
- int data_sz;
- LabelNode( const string &s,int sz ):ident(s),data_sz(sz){}
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct GotoNode : public StmtNode{
- string ident;
- GotoNode( const string &s ):ident(s){}
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct GosubNode : public StmtNode{
- string ident;
- GosubNode( const string &s ):ident(s){}
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct IfNode : public StmtNode{
- ExprNode *expr;
- StmtSeqNode *stmts,*elseOpt;
- IfNode( ExprNode *e,StmtSeqNode *s,StmtSeqNode *o ):expr(e),stmts(s),elseOpt(o){}
- ~IfNode(){ delete expr;delete stmts;delete elseOpt; }
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct ExitNode : public StmtNode{
- string sem_brk;
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct WhileNode : public StmtNode{
- int wendPos;
- ExprNode *expr;
- StmtSeqNode *stmts;
- string sem_brk;
- WhileNode( ExprNode *e,StmtSeqNode *s,int wp ):expr(e),stmts(s),wendPos(wp){}
- ~WhileNode(){ delete expr;delete stmts; }
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct ForNode : public StmtNode{
- int nextPos;
- VarNode *var;
- ExprNode *fromExpr,*toExpr,*stepExpr;
- StmtSeqNode *stmts;
- string sem_brk;
- ForNode( VarNode *v,ExprNode *f,ExprNode *t,ExprNode *s,StmtSeqNode *ss,int np );
- ~ForNode();
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct ForEachNode : public StmtNode{
- int nextPos;
- VarNode *var;
- string typeIdent;
- StmtSeqNode *stmts;
- string sem_brk;
- ForEachNode( VarNode *v,const string &t,StmtSeqNode *s,int np):var(v),typeIdent(t),stmts(s),nextPos(np){}
- ~ForEachNode(){ delete var;delete stmts; }
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct ReturnNode : public StmtNode{
- ExprNode *expr;
- string returnLabel;
- ReturnNode( ExprNode *e ):expr( e ){}
- ~ReturnNode(){ delete expr; }
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct DeleteNode : public StmtNode{
- ExprNode *expr;
- DeleteNode( ExprNode *e ):expr(e){}
- ~DeleteNode(){ delete expr; }
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct DeleteEachNode : public StmtNode{
- string typeIdent;
- DeleteEachNode( const string &t ):typeIdent(t){}
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct InsertNode : public StmtNode{
- ExprNode *expr1,*expr2;
- bool before;
- InsertNode( ExprNode *e1,ExprNode *e2,bool b ):expr1(e1),expr2(e2),before(b){}
- ~InsertNode(){ delete expr1;delete expr2; }
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct CaseNode : public Node{
- ExprSeqNode *exprs;
- StmtSeqNode *stmts;
- CaseNode( ExprSeqNode *e,StmtSeqNode *s ):exprs(e),stmts(s){}
- ~CaseNode(){ delete exprs;delete stmts; }
- };
- struct SelectNode : public StmtNode{
- ExprNode *expr;
- StmtSeqNode *defStmts;
- vector<CaseNode*> cases;
- VarNode *sem_temp;
- SelectNode( ExprNode *e ):expr(e),defStmts(0),sem_temp(0){}
- ~SelectNode(){ delete expr;delete defStmts;delete sem_temp;for( ;cases.size();cases.pop_back() ) delete cases.back(); }
- void push_back( CaseNode *c ){ cases.push_back( c ); }
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct RepeatNode : public StmtNode{
- int untilPos;
- StmtSeqNode *stmts;
- ExprNode *expr;
- string sem_brk;
- RepeatNode( StmtSeqNode *s,ExprNode *e,int up ):stmts(s),expr(e),untilPos(up){}
- ~RepeatNode(){ delete stmts;delete expr; }
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct ReadNode : public StmtNode{
- VarNode *var;
- ReadNode( VarNode *v ):var(v){}
- ~ReadNode(){ delete var; }
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- struct RestoreNode : public StmtNode{
- string ident;
- Label *sem_label;
- RestoreNode( const string &i ):ident(i){}
- void semant( Environ *e );
- void translate( Codegen *g );
- };
- #endif
|