2014-01-31 08:23:00 +13:00
|
|
|
|
|
|
|
|
#ifndef EXPRNODE_H
|
|
|
|
|
#define EXPRNODE_H
|
|
|
|
|
|
2019-01-18 15:55:51 +01:00
|
|
|
#include "node.hpp"
|
2014-01-31 08:23:00 +13:00
|
|
|
|
|
|
|
|
struct ConstNode; //is constant int,float or string
|
|
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
struct ExprNode : public Node {
|
2014-01-31 08:23:00 +13:00
|
|
|
Type *sem_type;
|
2016-05-07 22:49:54 +02:00
|
|
|
ExprNode() :sem_type(0) {}
|
|
|
|
|
ExprNode(Type *t) :sem_type(t) {}
|
2014-01-31 08:23:00 +13:00
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
ExprNode *castTo(Type *ty, Environ *e);
|
|
|
|
|
ExprNode *semant(Environ *e, Type *ty);
|
2014-01-31 08:23:00 +13:00
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
virtual ExprNode *semant(Environ *e) = 0;
|
|
|
|
|
virtual TNode *translate(Codegen *g) = 0;
|
|
|
|
|
virtual ConstNode *constNode() { return 0; }
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
struct ExprSeqNode : public Node {
|
2014-01-31 08:23:00 +13:00
|
|
|
vector<ExprNode*> exprs;
|
2016-05-07 22:49:54 +02:00
|
|
|
~ExprSeqNode() { for (; exprs.size(); exprs.pop_back()) delete exprs.back(); }
|
|
|
|
|
void push_back(ExprNode *e) { exprs.push_back(e); }
|
|
|
|
|
int size() { return exprs.size(); }
|
|
|
|
|
void semant(Environ *e);
|
|
|
|
|
TNode *translate(Codegen *g, bool userlib);
|
|
|
|
|
void castTo(DeclSeq *ds, Environ *e, bool userlib);
|
|
|
|
|
void castTo(Type *t, Environ *e);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2019-01-18 15:55:51 +01:00
|
|
|
#include "varnode.hpp"
|
2014-01-31 08:23:00 +13:00
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
struct CastNode : public ExprNode {
|
2014-01-31 08:23:00 +13:00
|
|
|
ExprNode *expr;
|
|
|
|
|
Type *type;
|
2016-05-07 22:49:54 +02:00
|
|
|
CastNode(ExprNode *ex, Type *ty) :expr(ex), type(ty) {}
|
|
|
|
|
~CastNode() { delete expr; }
|
|
|
|
|
ExprNode *semant(Environ *e);
|
|
|
|
|
TNode *translate(Codegen *g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
struct CallNode : public ExprNode {
|
|
|
|
|
string ident, tag;
|
2014-01-31 08:23:00 +13:00
|
|
|
ExprSeqNode *exprs;
|
|
|
|
|
Decl *sem_decl;
|
2016-05-07 22:49:54 +02:00
|
|
|
CallNode(const string &i, const string &t, ExprSeqNode *e) :ident(i), tag(t), exprs(e) {}
|
|
|
|
|
~CallNode() { delete exprs; }
|
|
|
|
|
ExprNode *semant(Environ *e);
|
|
|
|
|
TNode *translate(Codegen *g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
struct VarExprNode : public ExprNode {
|
2014-01-31 08:23:00 +13:00
|
|
|
VarNode *var;
|
2016-05-07 22:49:54 +02:00
|
|
|
VarExprNode(VarNode *v) :var(v) {}
|
|
|
|
|
~VarExprNode() { delete var; }
|
|
|
|
|
ExprNode *semant(Environ *e);
|
|
|
|
|
TNode *translate(Codegen *g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
struct ConstNode : public ExprNode {
|
|
|
|
|
ExprNode *semant(Environ *e) { return this; }
|
|
|
|
|
ConstNode *constNode() { return this; }
|
|
|
|
|
virtual int intValue() = 0;
|
|
|
|
|
virtual float floatValue() = 0;
|
|
|
|
|
virtual string stringValue() = 0;
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
struct IntConstNode : public ConstNode {
|
2014-01-31 08:23:00 +13:00
|
|
|
int value;
|
2016-05-07 22:49:54 +02:00
|
|
|
IntConstNode(int n);
|
|
|
|
|
TNode *translate(Codegen *g);
|
2014-01-31 08:23:00 +13:00
|
|
|
int intValue();
|
|
|
|
|
float floatValue();
|
|
|
|
|
string stringValue();
|
|
|
|
|
};
|
|
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
struct FloatConstNode : public ConstNode {
|
2014-01-31 08:23:00 +13:00
|
|
|
float value;
|
2016-05-07 22:49:54 +02:00
|
|
|
FloatConstNode(float f);
|
|
|
|
|
TNode *translate(Codegen *g);
|
2014-01-31 08:23:00 +13:00
|
|
|
int intValue();
|
|
|
|
|
float floatValue();
|
|
|
|
|
string stringValue();
|
|
|
|
|
};
|
|
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
struct StringConstNode : public ConstNode {
|
2014-01-31 08:23:00 +13:00
|
|
|
string value;
|
2016-05-07 22:49:54 +02:00
|
|
|
StringConstNode(const string &s);
|
|
|
|
|
TNode *translate(Codegen *g);
|
2014-01-31 08:23:00 +13:00
|
|
|
int intValue();
|
|
|
|
|
float floatValue();
|
|
|
|
|
string stringValue();
|
|
|
|
|
};
|
|
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
struct UniExprNode : public ExprNode {
|
|
|
|
|
int op; ExprNode *expr;
|
|
|
|
|
UniExprNode(int op, ExprNode *expr) :op(op), expr(expr) {}
|
|
|
|
|
~UniExprNode() { delete expr; }
|
2014-01-31 08:23:00 +13:00
|
|
|
ExprNode *constize();
|
2016-05-07 22:49:54 +02:00
|
|
|
ExprNode *semant(Environ *e);
|
|
|
|
|
TNode *translate(Codegen *g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// and, or, eor, lsl, lsr, asr
|
2016-05-07 22:49:54 +02:00
|
|
|
struct BinExprNode : public ExprNode {
|
|
|
|
|
int op; ExprNode *lhs, *rhs;
|
|
|
|
|
BinExprNode(int op, ExprNode *lhs, ExprNode *rhs) :op(op), lhs(lhs), rhs(rhs) {}
|
|
|
|
|
~BinExprNode() { delete lhs; delete rhs; }
|
|
|
|
|
ExprNode *semant(Environ *e);
|
|
|
|
|
TNode *translate(Codegen *g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// *,/,Mod,+,-
|
2016-05-07 22:49:54 +02:00
|
|
|
struct ArithExprNode : public ExprNode {
|
|
|
|
|
int op; ExprNode *lhs, *rhs;
|
|
|
|
|
ArithExprNode(int op, ExprNode *lhs, ExprNode *rhs) :op(op), lhs(lhs), rhs(rhs) {}
|
|
|
|
|
~ArithExprNode() { delete lhs; delete rhs; }
|
|
|
|
|
ExprNode *semant(Environ *e);
|
|
|
|
|
TNode *translate(Codegen *g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//<,=,>,<=,<>,>=
|
2016-05-07 22:49:54 +02:00
|
|
|
struct RelExprNode : public ExprNode {
|
|
|
|
|
int op; ExprNode *lhs, *rhs;
|
2014-01-31 08:23:00 +13:00
|
|
|
Type *opType;
|
2016-05-07 22:49:54 +02:00
|
|
|
RelExprNode(int op, ExprNode *lhs, ExprNode *rhs) :op(op), lhs(lhs), rhs(rhs) {}
|
|
|
|
|
~RelExprNode() { delete lhs; delete rhs; }
|
|
|
|
|
ExprNode *semant(Environ *e);
|
|
|
|
|
TNode *translate(Codegen *g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
struct NewNode : public ExprNode {
|
2014-01-31 08:23:00 +13:00
|
|
|
string ident;
|
2016-05-07 22:49:54 +02:00
|
|
|
NewNode(const string &i) :ident(i) {}
|
|
|
|
|
ExprNode *semant(Environ *e);
|
|
|
|
|
TNode *translate(Codegen *g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
struct FirstNode : public ExprNode {
|
2014-01-31 08:23:00 +13:00
|
|
|
string ident;
|
2016-05-07 22:49:54 +02:00
|
|
|
FirstNode(const string &i) :ident(i) {}
|
|
|
|
|
ExprNode *semant(Environ *e);
|
|
|
|
|
TNode *translate(Codegen *g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
struct LastNode : public ExprNode {
|
2014-01-31 08:23:00 +13:00
|
|
|
string ident;
|
2016-05-07 22:49:54 +02:00
|
|
|
LastNode(const string &i) :ident(i) {}
|
|
|
|
|
ExprNode *semant(Environ *e);
|
|
|
|
|
TNode *translate(Codegen *g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
struct AfterNode : public ExprNode {
|
2014-01-31 08:23:00 +13:00
|
|
|
ExprNode *expr;
|
2016-05-07 22:49:54 +02:00
|
|
|
AfterNode(ExprNode *e) :expr(e) {}
|
|
|
|
|
~AfterNode() { delete expr; }
|
|
|
|
|
ExprNode *semant(Environ *e);
|
|
|
|
|
TNode *translate(Codegen *g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
struct BeforeNode : public ExprNode {
|
2014-01-31 08:23:00 +13:00
|
|
|
ExprNode *expr;
|
2016-05-07 22:49:54 +02:00
|
|
|
BeforeNode(ExprNode *e) :expr(e) {}
|
|
|
|
|
~BeforeNode() { delete expr; }
|
|
|
|
|
ExprNode *semant(Environ *e);
|
|
|
|
|
TNode *translate(Codegen *g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
struct NullNode : public ExprNode {
|
|
|
|
|
ExprNode *semant(Environ *e);
|
|
|
|
|
TNode *translate(Codegen *g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
struct ObjectCastNode : public ExprNode {
|
2014-01-31 08:23:00 +13:00
|
|
|
ExprNode *expr;
|
|
|
|
|
string type_ident;
|
2016-05-07 22:49:54 +02:00
|
|
|
ObjectCastNode(ExprNode *e, const string &t) :expr(e), type_ident(t) {}
|
|
|
|
|
~ObjectCastNode() { delete expr; }
|
|
|
|
|
ExprNode *semant(Environ *e);
|
|
|
|
|
TNode *translate(Codegen *g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
2016-05-07 22:49:54 +02:00
|
|
|
struct ObjectHandleNode : public ExprNode {
|
2014-01-31 08:23:00 +13:00
|
|
|
ExprNode *expr;
|
2016-05-07 22:49:54 +02:00
|
|
|
ObjectHandleNode(ExprNode *e) :expr(e) {}
|
|
|
|
|
~ObjectHandleNode() { delete expr; }
|
|
|
|
|
ExprNode *semant(Environ *e);
|
|
|
|
|
TNode *translate(Codegen *g);
|
2014-01-31 08:23:00 +13:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif
|