2014-01-31 08:23:00 +13:00
|
|
|
|
|
|
|
|
#ifndef STMTNODE_H
|
|
|
|
|
#define STMTNODE_H
|
|
|
|
|
|
2019-01-18 15:55:51 +01:00
|
|
|
#include "node.hpp"
|
2014-01-31 08:23:00 +13:00
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
struct StmtNode : public Node {
|
|
|
|
|
int pos; //offset in source stream
|
|
|
|
|
StmtNode() : pos(-1) {}
|
|
|
|
|
void debug(int pos, Codegen* g);
|
2014-01-31 08:23:00 +13:00
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
virtual void semant(Environ* e) {}
|
|
|
|
|
virtual void translate(Codegen* g) {}
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
struct StmtSeqNode : public Node {
|
|
|
|
|
string file;
|
2014-01-31 08:23:00 +13:00
|
|
|
vector<StmtNode*> stmts;
|
2019-01-18 17:04:57 +01:00
|
|
|
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();
|
|
|
|
|
}
|
2014-01-31 08:23:00 +13:00
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
static void reset(const string& file, const string& lab);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 15:55:51 +01:00
|
|
|
#include "declnode.hpp"
|
2019-01-18 17:04:57 +01:00
|
|
|
#include "exprnode.hpp"
|
2014-01-31 08:23:00 +13:00
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
struct IncludeNode : public StmtNode {
|
|
|
|
|
string file, label;
|
|
|
|
|
StmtSeqNode* stmts;
|
|
|
|
|
IncludeNode(const string& t, StmtSeqNode* ss) : file(t), stmts(ss) {}
|
|
|
|
|
~IncludeNode()
|
|
|
|
|
{
|
|
|
|
|
delete stmts;
|
|
|
|
|
}
|
2014-01-31 08:23:00 +13:00
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
void semant(Environ* e);
|
|
|
|
|
void translate(Codegen* g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
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);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
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);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
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);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
struct ExprStmtNode : public StmtNode {
|
|
|
|
|
ExprNode* expr;
|
|
|
|
|
ExprStmtNode(ExprNode* e) : expr(e) {}
|
|
|
|
|
~ExprStmtNode()
|
|
|
|
|
{
|
|
|
|
|
delete expr;
|
|
|
|
|
}
|
|
|
|
|
void semant(Environ* e);
|
|
|
|
|
void translate(Codegen* g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
struct LabelNode : public StmtNode {
|
2014-01-31 08:23:00 +13:00
|
|
|
string ident;
|
2019-01-18 17:04:57 +01:00
|
|
|
int data_sz;
|
|
|
|
|
LabelNode(const string& s, int sz) : ident(s), data_sz(sz) {}
|
|
|
|
|
void semant(Environ* e);
|
|
|
|
|
void translate(Codegen* g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
struct GotoNode : public StmtNode {
|
2014-01-31 08:23:00 +13:00
|
|
|
string ident;
|
2019-01-18 17:04:57 +01:00
|
|
|
GotoNode(const string& s) : ident(s) {}
|
|
|
|
|
void semant(Environ* e);
|
|
|
|
|
void translate(Codegen* g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
struct GosubNode : public StmtNode {
|
2014-01-31 08:23:00 +13:00
|
|
|
string ident;
|
2019-01-18 17:04:57 +01:00
|
|
|
GosubNode(const string& s) : ident(s) {}
|
|
|
|
|
void semant(Environ* e);
|
|
|
|
|
void translate(Codegen* g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
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);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
struct ExitNode : public StmtNode {
|
2014-01-31 08:23:00 +13:00
|
|
|
string sem_brk;
|
2019-01-18 17:04:57 +01:00
|
|
|
void semant(Environ* e);
|
|
|
|
|
void translate(Codegen* g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
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);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
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);
|
2014-01-31 08:23:00 +13:00
|
|
|
~ForNode();
|
2019-01-18 17:04:57 +01:00
|
|
|
void semant(Environ* e);
|
|
|
|
|
void translate(Codegen* g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
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);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
struct ReturnNode : public StmtNode {
|
|
|
|
|
ExprNode* expr;
|
|
|
|
|
string returnLabel;
|
|
|
|
|
ReturnNode(ExprNode* e) : expr(e) {}
|
|
|
|
|
~ReturnNode()
|
|
|
|
|
{
|
|
|
|
|
delete expr;
|
|
|
|
|
}
|
|
|
|
|
void semant(Environ* e);
|
|
|
|
|
void translate(Codegen* g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
struct DeleteNode : public StmtNode {
|
|
|
|
|
ExprNode* expr;
|
|
|
|
|
DeleteNode(ExprNode* e) : expr(e) {}
|
|
|
|
|
~DeleteNode()
|
|
|
|
|
{
|
|
|
|
|
delete expr;
|
|
|
|
|
}
|
|
|
|
|
void semant(Environ* e);
|
|
|
|
|
void translate(Codegen* g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
struct DeleteEachNode : public StmtNode {
|
2014-01-31 08:23:00 +13:00
|
|
|
string typeIdent;
|
2019-01-18 17:04:57 +01:00
|
|
|
DeleteEachNode(const string& t) : typeIdent(t) {}
|
|
|
|
|
void semant(Environ* e);
|
|
|
|
|
void translate(Codegen* g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
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);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
struct CaseNode : public Node {
|
|
|
|
|
ExprSeqNode* exprs;
|
|
|
|
|
StmtSeqNode* stmts;
|
|
|
|
|
CaseNode(ExprSeqNode* e, StmtSeqNode* s) : exprs(e), stmts(s) {}
|
|
|
|
|
~CaseNode()
|
|
|
|
|
{
|
|
|
|
|
delete exprs;
|
|
|
|
|
delete stmts;
|
|
|
|
|
}
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
struct SelectNode : public StmtNode {
|
|
|
|
|
ExprNode* expr;
|
|
|
|
|
StmtSeqNode* defStmts;
|
2014-01-31 08:23:00 +13:00
|
|
|
vector<CaseNode*> cases;
|
2019-01-18 17:04:57 +01:00
|
|
|
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);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
struct ReadNode : public StmtNode {
|
|
|
|
|
VarNode* var;
|
|
|
|
|
ReadNode(VarNode* v) : var(v) {}
|
|
|
|
|
~ReadNode()
|
|
|
|
|
{
|
|
|
|
|
delete var;
|
|
|
|
|
}
|
|
|
|
|
void semant(Environ* e);
|
|
|
|
|
void translate(Codegen* g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 17:04:57 +01:00
|
|
|
struct RestoreNode : public StmtNode {
|
2014-01-31 08:23:00 +13:00
|
|
|
string ident;
|
2019-01-18 17:04:57 +01:00
|
|
|
Label* sem_label;
|
|
|
|
|
RestoreNode(const string& i) : ident(i) {}
|
|
|
|
|
void semant(Environ* e);
|
|
|
|
|
void translate(Codegen* g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif
|