Files
BlitzNext/compiler/stmtnode.hpp
T

303 lines
5.9 KiB
C++
Raw Normal View History

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