Added constructors/destructors for TypeVal and Value
This commit is contained in:
parent
bd66b4ad11
commit
f84b631124
2 changed files with 22 additions and 32 deletions
|
@ -4,47 +4,26 @@
|
|||
#include <iostream>
|
||||
#include "../parser/parser.tab.h"
|
||||
|
||||
|
||||
struct Value* make_value(TypeTag type, long num, double dec, struct Node* expr, std::string str) {
|
||||
/* allocate space */
|
||||
struct Value* val = new Value();
|
||||
|
||||
/* set properties */
|
||||
val->type = type;
|
||||
if (type == LONG || type == BOOLEAN) {
|
||||
val->value.num = num;
|
||||
} else if (type == DOUBLE){ // Assume DOUBLE
|
||||
val->value.dec = dec;
|
||||
} else if (type == STRING) {
|
||||
val->value.str = str;
|
||||
} else { // Assume lambda expression
|
||||
val->value.expr = expr;
|
||||
}
|
||||
|
||||
/* return new variable */
|
||||
return val;
|
||||
}
|
||||
|
||||
struct Value* make_long(long num) {
|
||||
return make_value(LONG, num, 0, nullptr, "");
|
||||
return new Value(LONG, num, 0, nullptr, "");
|
||||
}
|
||||
struct Value* make_double(double dec) {
|
||||
return make_value(DOUBLE, 0, dec, nullptr, "");
|
||||
return new Value(DOUBLE, 0, dec, nullptr, "");
|
||||
}
|
||||
struct Value* make_true() {
|
||||
return make_value(BOOLEAN, 1, 0, nullptr, "");
|
||||
return new Value(BOOLEAN, 1, 0, nullptr, "");
|
||||
}
|
||||
struct Value* make_false() {
|
||||
return make_value(BOOLEAN, 0, 0, nullptr, "");
|
||||
return new Value(BOOLEAN, 0, 0, nullptr, "");
|
||||
}
|
||||
struct Value* make_boolean(int x) {
|
||||
return (x)? make_true() : make_false();
|
||||
}
|
||||
struct Value* make_expression(struct Node* expr) {
|
||||
return make_value(LAMBDA, 0, 0, expr, "");
|
||||
return new Value(LAMBDA, 0, 0, expr, "");
|
||||
}
|
||||
struct Value* make_string(std::string str) {
|
||||
return make_value(STRING, 0, 0, nullptr, str);
|
||||
return new Value(STRING, 0, 0, nullptr, str);
|
||||
}
|
||||
|
||||
void delete_value(struct Value* val) {
|
||||
|
|
|
@ -10,19 +10,30 @@ union TypeVal {
|
|||
double dec;
|
||||
struct Node* expr;
|
||||
std::string str;
|
||||
TypeVal() {}
|
||||
// TypeVal(const std::string& s) : str(s) {} // Construct Point object using initializer list.
|
||||
// TypeVal& operator=(const std::string& s) { new(&str) std::string(s); return *this; } // Assign Point object using placement 'new'.
|
||||
~TypeVal() {}
|
||||
TypeVal() { new(&str) std::string(); new(expr) struct Node*; }
|
||||
~TypeVal() { free(&str); free(expr); }
|
||||
};
|
||||
|
||||
struct Value {
|
||||
enum TypeTag type;
|
||||
TypeVal value;
|
||||
// Broken implemenation of constructor below
|
||||
Value(TypeTag t, long n, double d, struct Node* e, std::string s) {
|
||||
/* set properties */
|
||||
type = t;
|
||||
if (type == LONG || type == BOOLEAN) {
|
||||
value.num = n;
|
||||
} else if (type == DOUBLE){ // Assume DOUBLE
|
||||
value.dec = d;
|
||||
} else if (type == STRING) {
|
||||
value.str = s;
|
||||
} else { // Assume lambda expression
|
||||
value.expr = e;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Constructors
|
||||
struct Value* make_value(int type, long num, double dec, struct Node* expr, std::string str);
|
||||
struct Value* make_long(long num);
|
||||
struct Value* make_double(double dec);
|
||||
struct Value* make_true();
|
||||
|
|
Reference in a new issue