diff options
author | Camil Staps | 2018-04-03 21:14:37 +0200 |
---|---|---|
committer | Camil Staps | 2018-04-03 21:14:37 +0200 |
commit | b3f9bcbc307e3e8d455ccf560a61dc5129174728 (patch) | |
tree | c1a036d82a25452d8ade3ae29310a699aa809ddd | |
parent | Resolve #11: print end result as soon as it is in HNF (diff) |
Store integers without pointers
-rw-r--r-- | interpreter/code.c | 23 | ||||
-rw-r--r-- | interpreter/eval.c | 5 | ||||
-rw-r--r-- | interpreter/graphs.c | 8 | ||||
-rw-r--r-- | interpreter/lex.c | 5 | ||||
-rw-r--r-- | interpreter/parse.c | 3 | ||||
-rw-r--r-- | interpreter/print.c | 2 | ||||
-rw-r--r-- | interpreter/syntax.c | 9 | ||||
-rw-r--r-- | interpreter/syntax.h | 2 |
8 files changed, 29 insertions, 28 deletions
diff --git a/interpreter/code.c b/interpreter/code.c index 88f58b7..f047add 100644 --- a/interpreter/code.c +++ b/interpreter/code.c @@ -7,12 +7,11 @@ #include "mem.h" #include "print.h" -void fill_node_int(struct node **node, int i) { +void fill_node_int(struct node **node, INT i) { unsigned int used_count = (*node)->used_count; free_node(*node, used_count, 0); (*node)->kind = NODE_INT; - (*node)->var1 = my_calloc(1, sizeof(int)); - *((int*) (*node)->var1) = i; + (*node)->var1 = (void*) i; use_node(*node, used_count); } @@ -45,63 +44,63 @@ void code_add(struct node **result, struct node *a, struct node *b) { if (a->kind != NODE_INT || b->kind != NODE_INT) fill_node_name(result, "add on non-ints"); else - fill_node_int(result, *((int*) b->var1) + *((int*) a->var1)); + fill_node_int(result, (INT) b->var1 + (INT) a->var1); } void code_mul(struct node **result, struct node *a, struct node *b) { if (a->kind != NODE_INT || b->kind != NODE_INT) fill_node_name(result, "mul on non-ints"); else - fill_node_int(result, *((int*) a->var1) * *((int*) b->var1)); + fill_node_int(result, (INT) a->var1 * (INT) b->var1); } void code_sub(struct node **result, struct node *a, struct node *b) { if (a->kind != NODE_INT || b->kind != NODE_INT) fill_node_name(result, "sub on non-ints"); else - fill_node_int(result, *((int*) b->var1) - *((int*) a->var1)); + fill_node_int(result, (INT) b->var1 - (INT) a->var1); } void code_eq(struct node **result, struct node *a, struct node *b) { if (a->kind != NODE_INT || b->kind != NODE_INT) fill_node_name(result, "eq on non-ints"); else - fill_node_bool(result, *((int*) a->var1) == *((int*) b->var1)); + fill_node_bool(result, (INT) a->var1 == (INT) b->var1); } void code_gt(struct node **result, struct node *a, struct node *b) { if (a->kind != NODE_INT || b->kind != NODE_INT) fill_node_name(result, "gt on non-ints"); else - fill_node_bool(result, *((int*) a->var1) > *((int*) b->var1)); + fill_node_bool(result, (INT) a->var1 > (INT) b->var1); } void code_ge(struct node **result, struct node *a, struct node *b) { if (a->kind != NODE_INT || b->kind != NODE_INT) fill_node_name(result, "ge on non-ints"); else - fill_node_bool(result, *((int*) a->var1) >= *((int*) b->var1)); + fill_node_bool(result, (INT) a->var1 >= (INT) b->var1); } void code_lt(struct node **result, struct node *a, struct node *b) { if (a->kind != NODE_INT || b->kind != NODE_INT) fill_node_name(result, "lt on non-ints"); else - fill_node_bool(result, *((int*) a->var1) < *((int*) b->var1)); + fill_node_bool(result, (INT) a->var1 < (INT) b->var1); } void code_le(struct node **result, struct node *a, struct node *b) { if (a->kind != NODE_INT || b->kind != NODE_INT) fill_node_name(result, "le on non-ints"); else - fill_node_bool(result, *((int*) a->var1) <= *((int*) b->var1)); + fill_node_bool(result, (INT) a->var1 <= (INT) b->var1); } void code_ne(struct node **result, struct node *a, struct node *b) { if (a->kind != NODE_INT || b->kind != NODE_INT) fill_node_name(result, "ne on non-ints"); else - fill_node_bool(result, *((int*) a->var1) != *((int*) b->var1)); + fill_node_bool(result, (INT) a->var1 != (INT) b->var1); } struct code_mapping { diff --git a/interpreter/eval.c b/interpreter/eval.c index b86c32f..cfcdb0c 100644 --- a/interpreter/eval.c +++ b/interpreter/eval.c @@ -103,7 +103,7 @@ bool match_expr(struct fuspel *rules, struct expression *expr, struct node **nod switch (expr->kind) { case EXPR_INT: - return *((int*) (*node)->var1) == *((int*) expr->var1); + return (*node)->var1 == expr->var1; case EXPR_NAME: push_repl(_repls, (char*) expr->var1, *node); @@ -349,7 +349,7 @@ void print_eval(FILE *out, struct fuspel *rules, struct node **node) { switch ((*node)->kind) { case NODE_INT: - fprintf(out, "%d", *(int*)(*node)->var1); + fprintf(out, "%ld", (INT)(*node)->var1); break; case NODE_NAME: fprintf(out, "%s", (char*)(*node)->var1); @@ -373,6 +373,7 @@ void print_eval(FILE *out, struct fuspel *rules, struct node **node) { eval(rules, &tl, true); print_eval(out, rules, (struct node**) &tl->var1); tl = (struct node*) tl->var2; + eval(rules, &tl, true); } } fprintf(out, "]"); diff --git a/interpreter/graphs.c b/interpreter/graphs.c index 91f9a19..dca2c53 100644 --- a/interpreter/graphs.c +++ b/interpreter/graphs.c @@ -50,7 +50,7 @@ void free_node(struct node *node, unsigned int count, bool free_first) { } if (node->used_count == 0) { - if (node->kind == NODE_INT || node->kind == NODE_NAME) + if (node->kind == NODE_NAME) my_free(node->var1); if (node->kind == NODE_CODE) @@ -111,8 +111,7 @@ void cpy_expression_to_node(struct node *dst, struct expression *src) { dst->kind = src->kind; switch (src->kind) { case EXPR_INT: - dst->var1 = my_calloc(1, sizeof(int)); - *((int*) dst->var1) = *((int*) src->var1); + dst->var1 = src->var1; break; case EXPR_NAME: @@ -152,8 +151,7 @@ void cpy_node_to_expression(struct expression *dst, struct node *src) { dst->kind = src->kind; switch (src->kind) { case NODE_INT: - dst->var1 = my_calloc(1, sizeof(int)); - *((int*) dst->var1) = *((int*) src->var1); + dst->var1 = src->var1; break; case NODE_NAME: diff --git a/interpreter/lex.c b/interpreter/lex.c index c33d816..cc0241d 100644 --- a/interpreter/lex.c +++ b/interpreter/lex.c @@ -91,10 +91,9 @@ struct token_list *lex(struct token_list *list, char *input) { char *s; unsigned char len = lex_int_length(input); s = my_calloc(1, len + 1); - list->elems[list->index].kind = TOKEN_INT; - list->elems[list->index].var = my_calloc(1, sizeof(int)); strncpy(s, input, len); - *((int*) list->elems[list->index].var) = atoi(s); + list->elems[list->index].kind = TOKEN_INT; + list->elems[list->index].var = (void*)((INT)atoi(s)); my_free(s); input += len - 1; } else if (is_name_char(*input)) { diff --git a/interpreter/parse.c b/interpreter/parse.c index 2548262..cb2d311 100644 --- a/interpreter/parse.c +++ b/interpreter/parse.c @@ -32,8 +32,7 @@ bool parse_simple_expression(struct expression *expr, struct parsing_list *list) switch (list->tokens->elems[list->i].kind) { case TOKEN_INT: expr->kind = EXPR_INT; - expr->var1 = my_calloc(1, sizeof(int)); - *((int*) expr->var1) = *((int*) list->tokens->elems[list->i].var); + expr->var1 = list->tokens->elems[list->i].var; list->i++; return true; diff --git a/interpreter/print.c b/interpreter/print.c index d5134c9..67b99e8 100644 --- a/interpreter/print.c +++ b/interpreter/print.c @@ -64,7 +64,7 @@ void print_expression(struct expression *expr) { switch (expr->kind) { case EXPR_INT: - printf("%d", *((int*) expr->var1)); + printf("%ld", (INT) expr->var1); break; case EXPR_NAME: printf("%s", (char*) expr->var1); diff --git a/interpreter/syntax.c b/interpreter/syntax.c index 015f820..a147d46 100644 --- a/interpreter/syntax.c +++ b/interpreter/syntax.c @@ -5,6 +5,8 @@ #include "mem.h" void free_token(struct token *tk) { + if (tk->kind == TOKEN_INT) + return; if (tk->var) my_free(tk->var); } @@ -34,8 +36,7 @@ void cpy_expression(struct expression *dst, struct expression *src) { dst->kind = src->kind; switch (dst->kind) { case EXPR_INT: - dst->var1 = my_calloc(1, sizeof(int)); - *((int*) dst->var1) = *((int*) src->var1); + dst->var1 = src->var1; break; case EXPR_NAME: dst->var1 = my_calloc(1, strlen((char*) src->var1) + 1); @@ -64,7 +65,7 @@ bool eq_expression(struct expression *a, struct expression *b) { return 0; switch (a->kind) { - case EXPR_INT: return *((int*) a->var1) == *((int*) b->var1); + case EXPR_INT: return a->var1 == b->var1; case EXPR_NAME: return !strcmp(a->var1, b->var1); case EXPR_CODE: return a->var1 == b->var1; case EXPR_TUPLE: @@ -118,6 +119,8 @@ void free_expression(struct expression *expr) { switch (expr->kind) { case EXPR_INT: + break; + case EXPR_NAME: my_free(expr->var1); break; diff --git a/interpreter/syntax.h b/interpreter/syntax.h index 8c3c336..e60c03e 100644 --- a/interpreter/syntax.h +++ b/interpreter/syntax.h @@ -3,6 +3,8 @@ #include <stdbool.h> +typedef long int INT; + /* TOKENS */ enum token_kind { |