diff --git a/src/lang/ast.c b/src/lang/ast.c index cbb8795..93eb3b1 100644 --- a/src/lang/ast.c +++ b/src/lang/ast.c @@ -39,8 +39,51 @@ enum PawVal *op_unequals(struct PawAST *ast, enum PawVal *lhs, } enum PawVal *op_add(struct PawAST *ast, enum PawVal *lhs, enum PawVal *rhs) { - return make_pawval_int(ast->mem, - *(int *)val_get_data(lhs) + *(int *)val_get_data(rhs)); + float l; + float r; + if (*lhs == PAW_VAL_FLOAT) { + l = *(float *)val_get_data(lhs); + } else if (*lhs == PAW_VAL_INT) { + l = *(int *)val_get_data(lhs); + } + if (*rhs == PAW_VAL_FLOAT) { + r = *(float *)val_get_data(rhs); + } else if (*rhs == PAW_VAL_INT) { + r = *(int *)val_get_data(rhs); + } + return make_pawval_float(ast->mem, l + r); +} + +enum PawVal *op_mul(struct PawAST *ast, enum PawVal *lhs, enum PawVal *rhs) { + float l; + float r; + if (*lhs == PAW_VAL_FLOAT) { + l = *(float *)val_get_data(lhs); + } else if (*lhs == PAW_VAL_INT) { + l = *(int *)val_get_data(lhs); + } + if (*rhs == PAW_VAL_FLOAT) { + r = *(float *)val_get_data(rhs); + } else if (*rhs == PAW_VAL_INT) { + r = *(int *)val_get_data(rhs); + } + return make_pawval_float(ast->mem, l * r); +} + +enum PawVal *op_sub(struct PawAST *ast, enum PawVal *lhs, enum PawVal *rhs) { + float l; + float r; + if (*lhs == PAW_VAL_FLOAT) { + l = *(float *)val_get_data(lhs); + } else if (*lhs == PAW_VAL_INT) { + l = *(int *)val_get_data(lhs); + } + if (*rhs == PAW_VAL_FLOAT) { + r = *(float *)val_get_data(rhs); + } else if (*rhs == PAW_VAL_INT) { + r = *(int *)val_get_data(rhs); + } + return make_pawval_float(ast->mem, l - r); } enum PawVal *make_pawval_float(struct Mem *mem, float n) {