This commit is contained in:
zuckerberg 2021-07-12 18:23:48 -04:00
parent 186cab9ac9
commit 30457cd81a
3 changed files with 133 additions and 66 deletions

View File

@ -51,7 +51,7 @@ Value Context::eval(peg::Ast& ast) {
for (int i=0; i<ast.nodes.size(); i++) { for (int i=0; i<ast.nodes.size(); i++) {
exprs.args.push_back(getValue(eval(*nodes[i]))); exprs.args.push_back(getValue(eval(*nodes[i])));
} }
return Value(exprs); return exprs;
} else if (ast.name == "AdditionExpr") { } else if (ast.name == "AdditionExpr") {
Value value = getValue(eval(*nodes[0])); Value value = getValue(eval(*nodes[0]));
for (int i=1; i<nodes.size(); i+=2) { for (int i=1; i<nodes.size(); i+=2) {
@ -59,9 +59,9 @@ Value Context::eval(peg::Ast& ast) {
Value v2 = getValue(eval(*nodes[i+1])); Value v2 = getValue(eval(*nodes[i+1]));
// TODO: floats // TODO: floats
if (op == 0) { if (op == 0) {
value = Value(value.getInt(cxt) + v2.getInt(cxt)); value = value.getInt(cxt) + v2.getInt(cxt);
} else { } else {
value = Value(value.getInt(cxt) - v2.getInt(cxt)); value = value.getInt(cxt) - v2.getInt(cxt);
} }
} }
return value; return value;
@ -72,9 +72,9 @@ Value Context::eval(peg::Ast& ast) {
Value v2 = getValue(eval(*nodes[i+1])); Value v2 = getValue(eval(*nodes[i+1]));
// TODO: floats // TODO: floats
if (op == 0) { if (op == 0) {
value = Value(value.getInt(cxt) * v2.getInt(cxt)); value = value.getInt(cxt) * v2.getInt(cxt);
} else { } else {
value = Value(value.getInt(cxt) / v2.getInt(cxt)); value = value.getInt(cxt) / v2.getInt(cxt);
} }
} }
return value; return value;
@ -84,22 +84,22 @@ Value Context::eval(peg::Ast& ast) {
auto v1 = currentScope->getVar(*this, name); auto v1 = currentScope->getVar(*this, name);
int op = (*nodes[1]).choice; int op = (*nodes[1]).choice;
auto v2 = getValue(eval(*nodes[2])); auto v2 = getValue(eval(*nodes[2]));
Value result = Value(Nil()); Value result = Nil();
// TODO: floats // TODO: floats
if (op == 0) { if (op == 0) {
result = Value(v1.getInt(cxt) * v2.getInt(cxt)); result = v1.getInt(cxt) * v2.getInt(cxt);
} else if (op == 1) { } else if (op == 1) {
result = Value(v1.getInt(cxt) % v2.getInt(cxt)); result = v1.getInt(cxt) % v2.getInt(cxt);
} else if (op == 2) { } else if (op == 2) {
result = Value(v1.getInt(cxt) + v2.getInt(cxt)); result = v1.getInt(cxt) + v2.getInt(cxt);
} else if (op == 3) { } else if (op == 3) {
result = Value(v1.getInt(cxt) - v2.getInt(cxt)); result = v1.getInt(cxt) - v2.getInt(cxt);
} else if (op == 4) { } else if (op == 4) {
result = Value(v1.getInt(cxt) & v2.getInt(cxt)); result = v1.getInt(cxt) & v2.getInt(cxt);
} else if (op == 5) { } else if (op == 5) {
result = Value(v1.getInt(cxt) ^ v2.getInt(cxt)); result = v1.getInt(cxt) ^ v2.getInt(cxt);
} else if (op == 6) { } else if (op == 6) {
result = Value(v1.getInt(cxt) | v2.getInt(cxt)); result = v1.getInt(cxt) | v2.getInt(cxt);
} else if (op == 7) { } else if (op == 7) {
result = v2; result = v2;
} }
@ -141,7 +141,7 @@ Value Context::eval(peg::Ast& ast) {
} }
} else if (ast.name == "Block") { } else if (ast.name == "Block") {
// TODO create new scope // TODO create new scope
Value result = Value(Nil()); Value result = Nil();
for (int i=0; i<ast.nodes.size(); i++) { for (int i=0; i<ast.nodes.size(); i++) {
result = eval(*nodes[i]); result = eval(*nodes[i]);
} }

View File

@ -53,85 +53,141 @@ Value::Value(const Identifier &identifier) : type(TypeIdentifier) {
} }
Value::Value(const Value &val) { Value::Value(const Value &val) {
type = val.type; if (val.isNil()) {
if (isNil()) { *this = Nil();
value.nil = Nil(); } else if (val.isInt()) {
} else if (isInt()) { *this = val.value.int_;
value.int_ = val.value.int_; } else if (val.isFloat()) {
} else if (isFloat()) { *this = val.value.float_;
value.float_ = val.value.float_; } else if (val.isBoolean()) {
} else if (isBoolean()) { *this = val.value.bool_;
value.bool_ = val.value.bool_; } else if (val.isString()) {
} else if (isString()) { *this = *val.value.string;
value.string = new std::string(*val.value.string); } else if (val.isFunction()) {
} else if (isFunction()) { *this = *val.value.function;
value.function = new Func(*val.value.function); } else if (val.isArgs()) {
} else if (isArgs()) { *this = *val.value.args;
value.args = new Args(*val.value.args); } else if (val.isIdentifier()) {
} else if (isIdentifier()) { *this = *val.value.identifier;
value.identifier = new Identifier(*val.value.identifier);
} }
} }
Value& Value::operator=(const Value &rhs) { Value& Value::operator=(const Value &rhs) {
type = rhs.type; cleanup();
if (isNil()) { if (rhs.isNil()) {
value.nil = Nil(); *this = Nil();
} else if (isInt()) { } else if (rhs.isInt()) {
value.int_ = rhs.value.int_; *this = rhs.value.int_;
} else if (isFloat()) { } else if (rhs.isFloat()) {
value.float_ = rhs.value.float_; *this = rhs.value.float_;
} else if (isBoolean()) { } else if (rhs.isBoolean()) {
value.bool_ = rhs.value.bool_; *this = rhs.value.bool_;
} else if (isString()) { } else if (rhs.isString()) {
value.string = new std::string(*rhs.value.string); *this = *rhs.value.string;
} else if (isFunction()) { } else if (rhs.isFunction()) {
value.function = new Func(*rhs.value.function); *this = *rhs.value.function;
} else if (isArgs()) { } else if (rhs.isArgs()) {
value.args = new Args(*rhs.value.args); *this = *rhs.value.args;
} else if (isIdentifier()) { } else if (rhs.isIdentifier()) {
value.identifier = new Identifier(*rhs.value.identifier); *this = *rhs.value.identifier;
} }
return *this; return *this;
} }
Value::~Value() { Value::~Value() {
cleanup();
}
void Value::cleanup() {
if (isString()) { if (isString()) {
std::cerr << "string" << std::endl;
delete value.string; delete value.string;
} else if (isFunction()) { } else if (isFunction()) {
std::cerr << "func" << std::endl;
delete value.function; delete value.function;
} else if (isArgs()) { } else if (isArgs()) {
std::cerr << "args" << std::endl;
delete value.args; delete value.args;
} else if (isIdentifier()) { } else if (isIdentifier()) {
std::cerr << "identifier" << std::endl;
delete value.identifier; delete value.identifier;
} }
} }
bool Value::isNil() { Value& Value::operator=(Nil rhs) {
// cleanup();
type = TypeNil;
value.nil = rhs;
return *this;
}
Value& Value::operator=(long rhs) {
// cleanup();
type = TypeInt;
value.int_ = rhs;
return *this;
}
Value& Value::operator=(double rhs) {
// cleanup();
type = TypeFloat;
value.float_ = rhs;
return *this;
}
Value& Value::operator=(bool rhs) {
// cleanup();
type = TypeBoolean;
value.bool_ = rhs;
return *this;
}
Value& Value::operator=(const std::string &rhs) {
// cleanup();
type = TypeString;
value.string = new std::string(rhs);
return *this;
}
Value& Value::operator=(const Func &rhs) {
// cleanup();
type = TypeFunction;
value.function = new Func(rhs);
return *this;
}
Value& Value::operator=(const Args &rhs) {
// cleanup();
type = TypeArgs;
value.args = new Args(rhs);
return *this;
}
Value& Value::operator=(const Identifier &rhs) {
// cleanup();
type = TypeIdentifier;
value.identifier = new Identifier(rhs);
return *this;
}
bool Value::isNil() const {
return type == TypeNil; return type == TypeNil;
} }
bool Value::isInt() { bool Value::isInt() const {
return type == TypeInt; return type == TypeInt;
} }
bool Value::isFloat() { bool Value::isFloat() const {
return type == TypeFloat; return type == TypeFloat;
} }
bool Value::isNumber() { bool Value::isNumber() const {
return isInt() || isFloat(); return isInt() || isFloat();
} }
bool Value::isBoolean() { bool Value::isBoolean() const {
return type == TypeBoolean; return type == TypeBoolean;
} }
bool Value::isString() { bool Value::isString() const {
return type == TypeString; return type == TypeString;
} }
bool Value::isFunction() { bool Value::isFunction() const {
return type == TypeFunction; return type == TypeFunction;
} }
bool Value::isArgs() { bool Value::isArgs() const {
return type == TypeArgs; return type == TypeArgs;
} }
bool Value::isIdentifier() { bool Value::isIdentifier() const {
return type == TypeIdentifier; return type == TypeIdentifier;
} }

View File

@ -96,15 +96,26 @@ public:
Value& operator=(const Value &rhs); Value& operator=(const Value &rhs);
~Value(); ~Value();
bool isNil(); void cleanup();
bool isInt();
bool isFloat(); Value& operator=(Nil rhs);
bool isNumber(); Value& operator=(long rhs);
bool isBoolean(); Value& operator=(double rhs);
bool isString(); Value& operator=(bool rhs);
bool isFunction(); Value& operator=(const std::string &rhs);
bool isArgs(); Value& operator=(const Func &rhs);
bool isIdentifier(); Value& operator=(const Args &rhs);
Value& operator=(const Identifier &rhs);
bool isNil() const;
bool isInt() const;
bool isFloat() const;
bool isNumber() const;
bool isBoolean() const;
bool isString() const;
bool isFunction() const;
bool isArgs() const;
bool isIdentifier() const;
void assertNil(Context &cxt); void assertNil(Context &cxt);
void assertInt(Context &cxt); void assertInt(Context &cxt);