#include #include #include #include #include "parser.h" #include "eval.h" bool arithmetic(luckytree *tree, luckyval *out){ if (strcmp(tree->function, "+") == 0){ argcounterror(tree, 2); if (tree->arguments->type == LUCKYINT && tree->arguments->nextelement->type == LUCKYINT){ out->i = tree->arguments->i + tree->arguments->nextelement->i; out->type = LUCKYINT; }else if (tree->arguments->type == LUCKYFLOAT && tree->arguments->nextelement->type == LUCKYFLOAT){ out->f = tree->arguments->f + tree->arguments->nextelement->f; out->type = LUCKYFLOAT; }else if (tree->arguments->type == LUCKYFLOAT && tree->arguments->nextelement->type == LUCKYINT){ out->f = tree->arguments->f + tree->arguments->nextelement->i; out->type = LUCKYFLOAT; }else if (tree->arguments->type == LUCKYINT && tree->arguments->nextelement->type == LUCKYFLOAT){ out->f = tree->arguments->i + tree->arguments->nextelement->f; out->type = LUCKYFLOAT; } else { printf("invalid types given!\n"); exit(1); } } else if (strcmp(tree->function, "-") == 0){ argcounterror(tree, 2); if (tree->arguments->type == LUCKYINT && tree->arguments->nextelement->type == LUCKYINT){ out->i = tree->arguments->i - tree->arguments->nextelement->i; out->type = LUCKYINT; }else if (tree->arguments->type == LUCKYFLOAT && tree->arguments->nextelement->type == LUCKYFLOAT){ out->f = tree->arguments->f - tree->arguments->nextelement->f; out->type = LUCKYFLOAT; }else if (tree->arguments->type == LUCKYFLOAT && tree->arguments->nextelement->type == LUCKYINT){ out->f = tree->arguments->f - tree->arguments->nextelement->i; out->type = LUCKYFLOAT; }else if (tree->arguments->type == LUCKYINT && tree->arguments->nextelement->type == LUCKYFLOAT){ out->f = tree->arguments->i - tree->arguments->nextelement->f; out->type = LUCKYFLOAT; } else { printf("invalid types given!\n"); exit(1); } } else if (strcmp(tree->function, "*") == 0){ argcounterror(tree, 2); if (tree->arguments->type == LUCKYINT && tree->arguments->nextelement->type == LUCKYINT){ out->i = tree->arguments->i * tree->arguments->nextelement->i; out->type = LUCKYINT; }else if (tree->arguments->type == LUCKYFLOAT && tree->arguments->nextelement->type == LUCKYFLOAT){ out->f = tree->arguments->f * tree->arguments->nextelement->f; out->type = LUCKYFLOAT; }else if (tree->arguments->type == LUCKYFLOAT && tree->arguments->nextelement->type == LUCKYINT){ out->f = tree->arguments->f * tree->arguments->nextelement->i; out->type = LUCKYFLOAT; }else if (tree->arguments->type == LUCKYINT && tree->arguments->nextelement->type == LUCKYFLOAT){ out->f = tree->arguments->i * tree->arguments->nextelement->f; out->type = LUCKYFLOAT; } else { printf("invalid types given!\n"); exit(1); } } else if (strcmp(tree->function, "/") == 0){ argcounterror(tree, 2); if (tree->arguments->type == LUCKYINT && tree->arguments->nextelement->type == LUCKYINT){ out->i = tree->arguments->i / tree->arguments->nextelement->i; out->type = LUCKYINT; }else if (tree->arguments->type == LUCKYFLOAT && tree->arguments->nextelement->type == LUCKYFLOAT){ out->f = tree->arguments->f / tree->arguments->nextelement->f; out->type = LUCKYFLOAT; }else if (tree->arguments->type == LUCKYFLOAT && tree->arguments->nextelement->type == LUCKYINT){ out->f = tree->arguments->f / tree->arguments->nextelement->i; out->type = LUCKYFLOAT; }else if (tree->arguments->type == LUCKYINT && tree->arguments->nextelement->type == LUCKYFLOAT){ out->f = tree->arguments->i / tree->arguments->nextelement->f; out->type = LUCKYFLOAT; } else { printf("invalid types given!\n"); exit(1); } } else return false; return true; } bool variableops(luckytree *tree, luckyval *out){ if (strcmp(tree->function, "let") == 0){ argcounterror(tree, 2); if (tree->arguments->type == LUCKYVAR) { variables[varcount] = malloc(sizeof(luckyvar)); variables[varcount]->name = strdup(tree->arguments->var); variables[varcount]->val = malloc(sizeof(luckyval)); memcpy(variables[varcount]->val, tree->arguments->nextelement, sizeof(luckyval)); varcount++; } else { printf("expected var name as the first argument!\n"); exit(1); } } else return false; return true; } bool io(luckytree *tree, luckyval *out){ if (strcmp(tree->function, "print") == 0){ argcounterror(tree, 1); if (tree->arguments->type == LUCKYINT) printf("%d\n", tree->arguments->i); if (tree->arguments->type == LUCKYFLOAT) printf("%f\n", tree->arguments->f); } else if (strcmp(tree->function, "readint") == 0){ argcounterror(tree, 0); int i; scanf("%d", &i); out->i = i; out->type = LUCKYINT; } else if (strcmp(tree->function, "readfloat") == 0){ argcounterror(tree, 0); float f; scanf("%f", &f); out->f = f; out->type = LUCKYFLOAT; } else return false; return true; }