From 573f2e041e4b4fae97608d8441b61eaddb2a4005 Mon Sep 17 00:00:00 2001 From: Aaro Koivukangas Date: Thu, 15 Aug 2024 16:26:06 +0200 Subject: [PATCH] added ast creation to parsing --- c/include/expr.h | 1 + c/include/token.h | 4 ++-- c/include/ttk_register.h | 10 ++++++++-- c/include/value.h | 3 ++- c/src/expr.c | 13 ++++++++++++- c/src/label.c | 3 +++ c/src/main.c | 6 ++++++ c/src/oper.c | 6 +++++- c/src/parser.bison | 21 +++++++++++---------- c/src/ttk_register.c | 25 ++++++++++++++++++++----- 10 files changed, 70 insertions(+), 22 deletions(-) diff --git a/c/include/expr.h b/c/include/expr.h index 9804e16..6af34e9 100644 --- a/c/include/expr.h +++ b/c/include/expr.h @@ -9,6 +9,7 @@ typedef enum { INSTRUCTION, + INSTRUCTION_ONE_ARG, LABEL_DEF, COMMENT } expr_t; diff --git a/c/include/token.h b/c/include/token.h index 683e3fe..e12ab8e 100644 --- a/c/include/token.h +++ b/c/include/token.h @@ -39,7 +39,7 @@ # define YY_YY_INCLUDE_TOKEN_H_INCLUDED /* Debug traces. */ #ifndef YYDEBUG -# define YYDEBUG 0 +# define YYDEBUG 1 #endif #if YYDEBUG extern int yydebug; @@ -81,7 +81,7 @@ extern int yydebug; #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { -#line 39 "src/parser.bison" +#line 40 "src/parser.bison" struct expr *expr; struct oper *oper; diff --git a/c/include/ttk_register.h b/c/include/ttk_register.h index 7c36844..88e76b4 100644 --- a/c/include/ttk_register.h +++ b/c/include/ttk_register.h @@ -1,12 +1,18 @@ #ifndef REGISTER_H #define REGISTER_H +typedef enum { + TTK_REGISTER, + STACK_TTK_REGISTER +} ttk_register_t; + struct ttk_register { + ttk_register_t kind; int id; int value; }; -struct ttk_register * ttk_register_create(char* id, int value); -int parse_register_num(char *name); +struct ttk_register * ttk_register_create(ttk_register_t kind, char* id, int value); +int parse_register_num(char *name, ttk_register_t kind); #endif diff --git a/c/include/value.h b/c/include/value.h index c520adc..5a7961a 100644 --- a/c/include/value.h +++ b/c/include/value.h @@ -12,7 +12,8 @@ typedef enum { typedef enum { NONE, - INDEXED + INDEXED, + INDEXED_ONLY_IREG } index_t; typedef enum { diff --git a/c/src/expr.c b/c/src/expr.c index 918dbc9..eef221a 100644 --- a/c/src/expr.c +++ b/c/src/expr.c @@ -3,7 +3,7 @@ struct expr * expr_create(expr_t kind, struct label *l, struct oper *o, struct ttk_register *f_arg, struct value *s_arg, struct comment *c, struct expr *n) { - struct expr * e = malloc(sizeof(*e)); + struct expr *e = malloc(sizeof(*e)); e->kind = kind; e->label = l; @@ -15,3 +15,14 @@ struct expr * expr_create(expr_t kind, struct label *l, struct oper *o, struct t return e; } + +void expr_copy(struct expr *orig, struct expr *copy) +{ + orig->kind = copy->kind; + orig->label = copy->label; + orig->oper = copy->oper; + orig->first_arg = copy->first_arg; + orig->second_arg = copy->second_arg; + orig->comment = copy->comment; + orig->next = copy->next; +} diff --git a/c/src/label.c b/c/src/label.c index 891e534..281c934 100644 --- a/c/src/label.c +++ b/c/src/label.c @@ -4,6 +4,9 @@ struct label * label_create(label_t kind, char *name, int value) { + if (!name) + return NULL; + struct label *l = malloc(sizeof(*l)); l->kind = kind; l->name = name; diff --git a/c/src/main.c b/c/src/main.c index 15e5bc6..76f6d7e 100644 --- a/c/src/main.c +++ b/c/src/main.c @@ -23,6 +23,12 @@ int main() } struct expr *parse_result = malloc(sizeof(*parse_result)); + if (!parse_result) + { + printf("ERROR: Failed to allocate memory for parse_result.\n"); + return 1; + } + if (yyparse(parse_result) == 0) { printf("Parse succesful :)\n"); diff --git a/c/src/oper.c b/c/src/oper.c index c3feb25..42b8c12 100644 --- a/c/src/oper.c +++ b/c/src/oper.c @@ -1,4 +1,5 @@ #include +#include #include "oper.h" @@ -6,8 +7,11 @@ struct oper * oper_create(oper_t kind, char* oper_name) { struct oper *o = malloc(sizeof(*o)); + char *name_copy = malloc(sizeof(char) * (strlen(oper_name)+1)); + strcpy(name_copy, oper_name); + o->kind = kind; - o->oper_name = oper_name; + o->oper_name = name_copy; return o; } diff --git a/c/src/parser.bison b/c/src/parser.bison index 1051f71..8562818 100644 --- a/c/src/parser.bison +++ b/c/src/parser.bison @@ -13,6 +13,7 @@ extern int yylineno; %define parse.error verbose + %parse-param { struct expr *parse_result } %token TOKEN_REGISTER @@ -66,15 +67,15 @@ extern int yylineno; %% -program : expr_list { parse_result = $1; } +program : expr_list { expr_copy(parse_result, $1); } ; -expr_list : expr expr_list { $$ = $1; $1->next = $2; } +expr_list : expr_list expr { $$ = $2; $2->next = $1; } | { $$ = NULL; } ; expr : oper ttk_register TOKEN_COMMA value { $$ = expr_create(INSTRUCTION, NULL, $1, $2, $4, NULL, NULL); } - | oper value { $$ = expr_create(INSTRUCTION, NULL, $1, NULL, $2, NULL, NULL); } + | oper value { $$ = expr_create(INSTRUCTION_ONE_ARG, NULL, $1, NULL, $2, NULL, NULL); } | TOKEN_LABEL TOKEN_COMP_OPER num_value { $$ = expr_create(LABEL_DEF, label_create(LABEL_CONST, $1, 0), NULL, NULL, NULL, NULL, NULL); /* TODO implement this properly */ } | TOKEN_LABEL oper ttk_register TOKEN_COMMA value { $$ = expr_create(INSTRUCTION, label_create(LABEL_TAG,$1, 0), $2, $3, $5, NULL, NULL); /* TODO FIXME labels have always value 0 */ } | TOKEN_LABEL oper value { $$ = expr_create(INSTRUCTION, label_create(LABEL_TAG,$1, 0), $2, NULL, $3, NULL, NULL); } @@ -89,16 +90,16 @@ oper : TOKEN_OPER_DATA { $$ = oper_create(OPER_DATA, $1 | TOKEN_OPER_SYS { $$ = oper_create(OPER_SYS, $1); } ; -ttk_register: TOKEN_REGISTER { $$ = ttk_register_create($1, 0); } - | TOKEN_STACK_REGISTER { $$ = ttk_register_create($1, 0); } +ttk_register: TOKEN_REGISTER { $$ = ttk_register_create(TTK_REGISTER, $1, 0); } + | TOKEN_STACK_REGISTER { $$ = ttk_register_create(STACK_TTK_REGISTER, $1, 0); } ; -value : pure_value TOKEN_PAREN_L ttk_register TOKEN_PAREN_R { value_create(DIRECT, INDEXED, $1, $3); } - | pure_value { value_create(DIRECT, NONE, $1, NULL); } - | TOKEN_ADDR_M pure_value TOKEN_PAREN_L ttk_register TOKEN_PAREN_R { value_create(parse_addr_mode($1), INDEXED, $2, $4); } - | TOKEN_ADDR_M pure_value { value_create(parse_addr_mode($1), NONE, $2, NULL); } - | TOKEN_PAREN_L ttk_register TOKEN_PAREN_R { value_create(DIRECT, NONE, NULL, $2); } +value : pure_value TOKEN_PAREN_L ttk_register TOKEN_PAREN_R { $$ = value_create(DIRECT, INDEXED, $1, $3); } + | pure_value { $$ = value_create(DIRECT, NONE, $1, NULL); } + | TOKEN_ADDR_M pure_value TOKEN_PAREN_L ttk_register TOKEN_PAREN_R { $$ = value_create(parse_addr_mode($1), INDEXED, $2, $4); } + | TOKEN_ADDR_M pure_value { $$ = value_create(parse_addr_mode($1), NONE, $2, NULL); } + | TOKEN_PAREN_L ttk_register TOKEN_PAREN_R { $$ = value_create(DIRECT, NONE, NULL, $2); } ; pure_value : ttk_register { $$ = pure_value_create(REGISTER, $1, 0, NULL); } diff --git a/c/src/ttk_register.c b/c/src/ttk_register.c index 11b0eee..de1aa31 100644 --- a/c/src/ttk_register.c +++ b/c/src/ttk_register.c @@ -1,22 +1,37 @@ #include +#include #include "ttk_register.h" -struct ttk_register * ttk_register_create(char* name, int value) +struct ttk_register * ttk_register_create(ttk_register_t kind, char* name, int value) { struct ttk_register * r = malloc(sizeof(*r)); - r->id = parse_register_num(name); + r->kind = kind; + r->id = parse_register_num(name, kind); r->value = value; return r; } -int parse_register_num(char* name) +int parse_register_num(char* name, ttk_register_t kind) { if (!name) { return -1; } - char num = name[1]; // registers have the format RX, 'R' + X 0-7 - return num - '0'; + switch (kind) + { + case TTK_REGISTER: + char num = name[1]; // registers have the format RX, 'R' + X 0-7 + return num - '0'; + case STACK_TTK_REGISTER: + if (strcasecmp("sp", name) == 0) + return 6; + if (strcasecmp("fp", name) == 0) + return 7; + + } + + return -1; // error, shouldn't end up here. + }