diff --git a/deon-win/deon/deon.l b/deon-win/deon/deon.l index d4ee70e..43c0fe5 100644 --- a/deon-win/deon/deon.l +++ b/deon-win/deon/deon.l @@ -6,7 +6,6 @@ #include "y.tab.h" void yyerror(char *); - extern YYSTYPE yylval; extern FILE *yyin; int yylineno; @@ -28,6 +27,8 @@ "char" { return KEYWORD_C; } "++" { return INCREASE; } "--" { return DECREASE; } +"<=" { return LESS_THAN_OR_EQUAL; } +">=" { return GREATER_THAN_OR_EQUAL; } \"(\\.|[^"\\])*\" { yytext++; yytext[strlen(yytext)-1] = 0; yylval.str_ptr = strdup(yytext); return STRING; } [a-zA-Z0-9_]+ { yylval.str_ptr = strdup(yytext); return VARNAME; } -?[0-9]*\.[0-9]+ { yylval.double_num = atof(yytext); return DOUBLEVAR; } @@ -64,7 +65,6 @@ int main(int argc, char* argv[]) || strcmp(argv[1],"d") == 0 || strcmp(argv[1],"debug") == 0) { _DEON_DEBUG = 1; - printf(">>> "); yyparse(); } else if (fh = fopen(argv[1], "r")) diff --git a/deon-win/deon/deon.vcxproj.user b/deon-win/deon/deon.vcxproj.user index 29ad4b4..5b823c8 100644 --- a/deon-win/deon/deon.vcxproj.user +++ b/deon-win/deon/deon.vcxproj.user @@ -2,26 +2,32 @@ -d - WindowsLocalDebugger + WindowsRemoteDebugger + -d -d - WindowsLocalDebugger + WindowsRemoteDebugger + -d -d WindowsLocalDebugger + -d -d - WindowsLocalDebugger + WindowsRemoteDebugger + -d -d WindowsLocalDebugger + -d -d - WindowsLocalDebugger + WindowsRemoteDebugger + -d \ No newline at end of file diff --git a/deon-win/deon/deon.y b/deon-win/deon/deon.y index 98cbe16..7aac019 100644 --- a/deon-win/deon/deon.y +++ b/deon-win/deon/deon.y @@ -13,7 +13,6 @@ int yylex(void); void yyerror(char *); extern int yylineno; - %} /* doing these before multiplication and division because they have a lower presidence */ @@ -33,14 +32,21 @@ extern int yylineno; struct node_info *node_ptr; } +%token INCREASE PRINT_TOKEN IF END KEYWORD_S KEYWORD_I KEYWORD_C QUOTE ELSE WHILE DEF CALL +%token LESS_THAN_OR_EQUAL +%token GREATER_THAN_OR_EQUAL +%token DECREASE -%token INCREASE DECREASE PRINT_TOKEN IF END KEYWORD_S KEYWORD_I KEYWORD_C QUOTE ELSE WHILE DEF CALL %token INTEGER +%type EXPR_I + %token STRING VARNAME %token CHAR + %token DOUBLEVAR +%type EXPR_D + %token FLOAT_NUM -%type EXPR %type STMT PRINT VARIABLE FUNC STMT_LIST LOGIC %% @@ -51,7 +57,7 @@ PROGRAM: ; MAIN: - MAIN FUNC ';' { if (_DEON_DEBUG == true ) { printf(">>> "); exec_stmt($2); } else { exec_stmt($2); } } + MAIN FUNC ';' { exec_stmt($2); } | ; @@ -77,43 +83,62 @@ LOGIC: IF '[' VARNAME ']' ':' '{' STMT_LIST '}' { $$ = create_logic_node(create_logic(IF_LOGIC, $7, $3)); } | WHILE '[' VARNAME ']' ':' '{' STMT_LIST '}' { $$ = create_logic_node(create_logic(WHILE_LOGIC, $7, $3)); } ; - VARIABLE: - VARNAME '=' STRING { $$ = create_variable_const($1, (void *) $3, VAR_STRING);} - | VARNAME '=' EXPR { $$ = create_variable_const($1, alloc_value(&$3, VAR_INT), VAR_INT);} - | VARNAME '=' CHAR { $$ = create_variable_const($1, alloc_value(&$3, VAR_BYTE), VAR_BYTE);} - | VARNAME '=' DOUBLEVAR { $$ = create_variable_const($1, alloc_value(&$3, VAR_DOUBLE), VAR_DOUBLE);} + VARNAME '=' STRING { $$ = create_variable($1, (void *) $3, VAR_STRING);} + | VARNAME '=' EXPR_I { $$ = create_variable($1, alloc_value(&$3, VAR_INT), VAR_INT);} + | VARNAME '=' EXPR_D { $$ = create_variable($1, alloc_value(&$3, VAR_DOUBLE), VAR_DOUBLE);} + | VARNAME '=' CHAR { $$ = create_variable($1, alloc_value(&$3, VAR_BYTE), VAR_BYTE);} + | VARNAME '=' DOUBLEVAR { $$ = create_variable($1, alloc_value(&$3, VAR_DOUBLE), VAR_DOUBLE);} | VARNAME '=' '{' STMT_LIST '}' { $$ = create_function($1, $4); } | VARNAME '=' VARNAME { $$ = move_value($1, $3); } ; -EXPR: +EXPR_I: INTEGER { $$ = $1; } - | EXPR '+' EXPR { $$ = $1 + $3; } - | EXPR '-' EXPR { $$ = $1 - $3; } - | EXPR '*' EXPR { $$ = $1 * $3; } - | EXPR '/' EXPR { $$ = $1 / $3; } - | EXPR '%' EXPR { $$ = $1 % $3; } - | EXPR '>' EXPR { if ($1 > $3) { $$ = 1; } else { $$ = 0;}} - | EXPR '<' EXPR { if ($1 < $3) { $$ = 1; } else { $$ = 0;}} - | INCREASE EXPR { $$ = $2 + 1; } - | EXPR INCREASE { $$ = $1 + 1; } - | DECREASE EXPR { $$ = $2 - 1; } - | EXPR DECREASE { $$ = $1 - 1; } - | '(' EXPR ')' { $$ = $2; } + | EXPR_I '+' EXPR_I { $$ = $1 + $3; } + | EXPR_I '-' EXPR_I { $$ = $1 - $3; } + | EXPR_I '*' EXPR_I { $$ = $1 * $3; } + | EXPR_I '/' EXPR_I { $$ = $1 / $3; } + | EXPR_I '%' EXPR_I { $$ = $1 % $3; } + | EXPR_I LESS_THAN_OR_EQUAL EXPR_I { $$ = $1 <= $3; } + | EXPR_I GREATER_THAN_OR_EQUAL EXPR_I { $$ = $1 >= $3; } + | EXPR_I '>' EXPR_I { $$ = $1 > $3; } + | EXPR_I '<' EXPR_I { $$ = $1 < $3; } + | INCREASE EXPR_I { $$ = $2 + 1; } + | EXPR_I INCREASE { $$ = $1 + 1; } + | DECREASE EXPR_I { $$ = $2 - 1; } + | EXPR_I DECREASE { $$ = $1 - 1; } + | '(' EXPR_I ')' { $$ = $2; } + | EXPR_I { $$ = $1; } + ; + +EXPR_D: + DOUBLEVAR + | EXPR_D '+' EXPR_D { $$ = $1 + $3; } + | EXPR_D '-' EXPR_D { $$ = $1 - $3; } + | EXPR_D '*' EXPR_D { $$ = $1 * $3; } + | EXPR_D '/' EXPR_D { $$ = $1 / $3; } + | EXPR_D LESS_THAN_OR_EQUAL EXPR_D { $$ = $1 <= $3; } + | EXPR_D GREATER_THAN_OR_EQUAL EXPR_D { $$ = $1 >= $3; } + | EXPR_D '>' EXPR_D { $$ = $1 > $3; } + | EXPR_D '<' EXPR_D { $$ = $1 < $3; } + | INCREASE EXPR_D { $$ = $2 + 1; } + | EXPR_D INCREASE { $$ = $1 + 1; } + | DECREASE EXPR_D { $$ = $2 - 1; } + | EXPR_D DECREASE { $$ = $1 - 1; } + | '(' EXPR_D ')' { $$ = $2; } + | EXPR_D { $$ = $1; } ; PRINT: VARNAME { $$ = create_print_variable($1); } - | EXPR { $$ = create_print_statement(VAR_INT, alloc_value(&$1, VAR_INT)); } + | EXPR_I { $$ = create_print_statement(VAR_INT, alloc_value(&$1, VAR_INT)); } | STRING { $$ = create_print_statement(VAR_STRING, $1); } ; - %% void yyerror(char *s) { fprintf(stderr, "Error on line %d, %s\n", yylineno, s); -} - +} \ No newline at end of file diff --git a/deon-win/deon/functions/functions.c b/deon-win/deon/functions/functions.c index 55e3e5c..ef4db97 100644 --- a/deon-win/deon/functions/functions.c +++ b/deon-win/deon/functions/functions.c @@ -8,18 +8,13 @@ create a function given the name of the function and the statements */ -static node_info *create_function(char *p_name, node_info *p_stmts) +static node_info* create_function(char* p_name, node_info* p_stmts) { - node_info *new_node = malloc(sizeof(node_info)); - if (!p_name || !p_stmts || !new_node) + if (!p_name || !p_stmts) return NULL; - memset(new_node, NULL, sizeof(*new_node)); + node_info *new_node = malloc(sizeof(node_info)); new_node->function_body = malloc(sizeof(node_info)); - if (!new_node->function_body) - return NULL; - - memset(new_node->function_body, NULL, sizeof(*new_node->function_body)); new_node->operation = FUNCTION_OPERATION; new_node->operation_type.func = FUNCTION; new_node->name = p_name; @@ -35,13 +30,12 @@ static node_info *create_function(char *p_name, node_info *p_stmts) create a function call given the name TODO add scope. */ -static node_info *create_function_call(char *p_name) +static node_info* create_function_call(char* p_name) { - node_info *new_node = malloc(sizeof(node_info)); - if (!new_node || !p_name) + if (!p_name) return NULL; - memset(new_node, NULL, sizeof(*new_node)); + node_info *new_node = malloc(sizeof(node_info)); new_node->operation = FUNCTION_OPERATION; new_node->operation_type.func = FUNCTION_CALL; new_node->name = p_name; @@ -55,7 +49,7 @@ static node_info *create_function_call(char *p_name) create compound statement given statement list and head of linked list. */ -static node_info *create_compound_statement(node_info *new_statement_list, node_info *statement_head) +static node_info* create_compound_statement(node_info* new_statement_list, node_info* statement_head) { if (!new_statement_list) return NULL; @@ -64,20 +58,12 @@ static node_info *create_compound_statement(node_info *new_statement_list, node_ { statement_head = malloc(sizeof(node_info)); node_info* new_node = malloc(sizeof(node_info)); - if (!new_node || !statement_head) - return NULL; - memset(statement_head, NULL, sizeof(*statement_head)); - memset(new_node, NULL, sizeof(*new_node)); statement_head->statement_list = malloc(sizeof(node_info)); - if (!statement_head->statement_list) - return NULL; - memset(statement_head->statement_list, NULL, - sizeof(*statement_head->statement_list)); - statement_head->operation = EXEC_STMT_LIST_OPERATION; statement_head->statement_list->operation = EXEC_STMT_LIST_OPERATION; statement_head->statement_list->next = new_statement_list; + statement_head->next = NULL; statement_head->statement_list->statement_list = NULL; } else @@ -88,13 +74,10 @@ static node_info *create_compound_statement(node_info *new_statement_list, node_ p_temp_head = p_temp_head->statement_list; p_temp_head->statement_list = malloc(sizeof(node_info)); - if (!p_temp_head->statement_list) - return NULL; - memset(p_temp_head->statement_list, NULL, sizeof(*p_temp_head->statement_list)); - p_temp_head->operation = EXEC_STMT_LIST_OPERATION; p_temp_head->statement_list->operation = EXEC_STMT_LIST_OPERATION; p_temp_head->statement_list->next = new_statement_list; + statement_head->next = NULL; p_temp_head->statement_list->statement_list = NULL; } return statement_head; @@ -112,6 +95,7 @@ static node_info* add_to_compound_statement(node_info* new_statement, node_info* return NULL; node_info* p_head_tmp = statement_head; + while (p_head_tmp->statement_list) p_head_tmp = p_head_tmp->statement_list; diff --git a/deon-win/deon/hashmap/map.c b/deon-win/deon/hashmap/map.c index 6a2a228..784465f 100644 --- a/deon-win/deon/hashmap/map.c +++ b/deon-win/deon/hashmap/map.c @@ -6,185 +6,186 @@ #include "map.h" struct map_node_t { - unsigned hash; - void *value; - map_node_t *next; - /* char key[]; */ - /* char value[]; */ + unsigned hash; + void* value; + map_node_t* next; + /* char key[]; */ + /* char value[]; */ }; -static unsigned map_hash(const char *str) { - unsigned hash = 5381; - while (*str) { - hash = ((hash << 5) + hash) ^ *str++; - } - return hash; +static unsigned map_hash(const char* str) { + unsigned hash = 5381; + while (*str) { + hash = ((hash << 5) + hash) ^ *str++; + } + return hash; } -static map_node_t *map_newnode(const char *key, void *value, int vsize) { - map_node_t *node; - int ksize = strlen(key) + 1; - int voffset = ksize + ((sizeof(void*) - ksize) % sizeof(void*)); - node = malloc(sizeof(*node) + voffset + vsize); - if (!node) return NULL; - memcpy(node + 1, key, ksize); - node->hash = map_hash(key); - node->value = ((char*) (node + 1)) + voffset; - memcpy(node->value, value, vsize); - return node; +static map_node_t* map_newnode(const char* key, void* value, int vsize) { + map_node_t* node; + int ksize = strlen(key) + 1; + int voffset = ksize + ((sizeof(void*) - ksize) % sizeof(void*)); + node = malloc(sizeof(*node) + voffset + vsize); + if (!node) return NULL; + memcpy(node + 1, key, ksize); + node->hash = map_hash(key); + node->value = ((char*)(node + 1)) + voffset; + memcpy(node->value, value, vsize); + return node; } -static int map_bucketidx(map_base_t *m, unsigned hash) { - /* If the implementation is changed to allow a non-power-of-2 bucket count, - * the line below should be changed to use mod instead of AND */ - return hash & (m->nbuckets - 1); +static int map_bucketidx(map_base_t* m, unsigned hash) { + /* If the implementation is changed to allow a non-power-of-2 bucket count, + * the line below should be changed to use mod instead of AND */ + return hash & (m->nbuckets - 1); } -static void map_addnode(map_base_t *m, map_node_t *node) { - int n = map_bucketidx(m, node->hash); - node->next = m->buckets[n]; - m->buckets[n] = node; +static void map_addnode(map_base_t* m, map_node_t* node) { + int n = map_bucketidx(m, node->hash); + node->next = m->buckets[n]; + m->buckets[n] = node; } -static int map_resize(map_base_t *m, int nbuckets) { - map_node_t *nodes, *node, *next; - map_node_t **buckets; - int i; - /* Chain all nodes together */ - nodes = NULL; - i = m->nbuckets; - while (i--) { - node = (m->buckets)[i]; - while (node) { - next = node->next; - node->next = nodes; - nodes = node; - node = next; +static int map_resize(map_base_t* m, int nbuckets) { + map_node_t* nodes, * node, * next; + map_node_t** buckets; + int i; + /* Chain all nodes together */ + nodes = NULL; + i = m->nbuckets; + while (i--) { + node = (m->buckets)[i]; + while (node) { + next = node->next; + node->next = nodes; + nodes = node; + node = next; + } + } + /* Reset buckets */ + buckets = realloc(m->buckets, sizeof(*m->buckets) * nbuckets); + if (buckets != NULL) { + m->buckets = buckets; + m->nbuckets = nbuckets; } - } - /* Reset buckets */ - buckets = realloc(m->buckets, sizeof(*m->buckets) * nbuckets); - if (buckets != NULL) { - m->buckets = buckets; - m->nbuckets = nbuckets; - } - if (m->buckets) { - memset(m->buckets, 0, sizeof(*m->buckets) * m->nbuckets); - /* Re-add nodes to buckets */ - node = nodes; - while (node) { - next = node->next; - map_addnode(m, node); - node = next; + if (m->buckets) { + memset(m->buckets, 0, sizeof(*m->buckets) * m->nbuckets); + /* Re-add nodes to buckets */ + node = nodes; + while (node) { + next = node->next; + map_addnode(m, node); + node = next; + } } - } - /* Return error code if realloc() failed */ - return (buckets == NULL) ? -1 : 0; + /* Return error code if realloc() failed */ + return (buckets == NULL) ? -1 : 0; } -static map_node_t **map_getref(map_base_t *m, const char *key) { - unsigned hash = map_hash(key); - map_node_t **next; - if (m->nbuckets > 0) { - next = &m->buckets[map_bucketidx(m, hash)]; - while (*next) { - if ((*next)->hash == hash && !strcmp((char*) (*next + 1), key)) { - return next; - } - next = &(*next)->next; +static map_node_t** map_getref(map_base_t* m, const char* key) { + unsigned hash = map_hash(key); + map_node_t** next; + if (m->nbuckets > 0) { + next = &m->buckets[map_bucketidx(m, hash)]; + while (*next) { + if ((*next)->hash == hash && !strcmp((char*)(*next + 1), key)) { + return next; + } + next = &(*next)->next; + } } - } - return NULL; + return NULL; } -void map_deinit_(map_base_t *m) { - map_node_t *next, *node; - int i; - i = m->nbuckets; - while (i--) { - node = m->buckets[i]; - while (node) { - next = node->next; - free(node); - node = next; +void map_deinit_(map_base_t* m) { + map_node_t* next, * node; + int i; + i = m->nbuckets; + while (i--) { + node = m->buckets[i]; + while (node) { + next = node->next; + free(node); + node = next; + } } - } - free(m->buckets); + free(m->buckets); } -void *map_get_(map_base_t *m, const char *key) { - map_node_t **next = map_getref(m, key); - return next ? (*next)->value : NULL; +void* map_get_(map_base_t* m, const char* key) { + map_node_t** next = map_getref(m, key); + return next ? (*next)->value : NULL; } -int map_set_(map_base_t *m, const char *key, void *value, int vsize) { - int n, err; - map_node_t **next, *node; - /* Find & replace existing node */ - next = map_getref(m, key); - if (next) { - memcpy((*next)->value, value, vsize); +int map_set_(map_base_t* m, const char* key, void* value, int vsize) { + int n, err; + map_node_t** next, * node; + /* Find & replace existing node */ + next = map_getref(m, key); + if (next) { + memcpy((*next)->value, value, vsize); + return 0; + } + /* Add new node */ + node = map_newnode(key, value, vsize); + if (node == NULL) goto fail; + if (m->nnodes >= m->nbuckets) { + n = (m->nbuckets > 0) ? (m->nbuckets << 1) : 1; + err = map_resize(m, n); + if (err) goto fail; + } + map_addnode(m, node); + m->nnodes++; return 0; - } - /* Add new node */ - node = map_newnode(key, value, vsize); - if (node == NULL) goto fail; - if (m->nnodes >= m->nbuckets) { - n = (m->nbuckets > 0) ? (m->nbuckets << 1) : 1; - err = map_resize(m, n); - if (err) goto fail; - } - map_addnode(m, node); - m->nnodes++; - return 0; - fail: - if (node) free(node); - return -1; +fail: + if (node) free(node); + return -1; } -void map_remove_(map_base_t *m, const char *key) { - map_node_t *node; - map_node_t **next = map_getref(m, key); - if (next) { - node = *next; - *next = (*next)->next; - free(node); - m->nnodes--; - } +void map_remove_(map_base_t* m, const char* key) { + map_node_t* node; + map_node_t** next = map_getref(m, key); + if (next) { + node = *next; + *next = (*next)->next; + free(node); + m->nnodes--; + } } map_iter_t map_iter_(void) { - map_iter_t iter; - iter.bucketidx = -1; - iter.node = NULL; - return iter; + map_iter_t iter; + iter.bucketidx = -1; + iter.node = NULL; + return iter; } -const char *map_next_(map_base_t *m, map_iter_t *iter) { - if (iter->node) { - iter->node = iter->node->next; - if (iter->node == NULL) goto nextBucket; - } else { +const char* map_next_(map_base_t* m, map_iter_t* iter) { + if (iter->node) { + iter->node = iter->node->next; + if (iter->node == NULL) goto nextBucket; + } + else { nextBucket: - do { - if (++iter->bucketidx >= m->nbuckets) { - return NULL; - } - iter->node = m->buckets[iter->bucketidx]; - } while (iter->node == NULL); - } - return (char*) (iter->node + 1); + do { + if (++iter->bucketidx >= m->nbuckets) { + return NULL; + } + iter->node = m->buckets[iter->bucketidx]; + } while (iter->node == NULL); + } + return (char*)(iter->node + 1); } #endif \ No newline at end of file diff --git a/deon-win/deon/linked_list/linked_list.c b/deon-win/deon/linked_list/linked_list.c index 955b954..896d116 100644 --- a/deon-win/deon/linked_list/linked_list.c +++ b/deon-win/deon/linked_list/linked_list.c @@ -12,6 +12,7 @@ static void free_linked_list(node_info *p_list) { if (!p_list) return; + node_info* temp; while (p_list->next) { @@ -23,19 +24,19 @@ static void free_linked_list(node_info *p_list) /* Author: xerox - Update: 1/20/2020 + Update: 5/13/2020 - updates linked list. + shallow copy linked list. */ -static node_info *copy_linked_list(node_info *p_list) +static node_info* shallow_copy_linked_list(node_info* p_list) { - node_info* new_list = malloc(sizeof(node_info)); - if (!new_list || !p_list) + if (!p_list) return NULL; + node_info* new_list = malloc(sizeof(node_info)); new_list->next = NULL; - node_info *copy_list = new_list; - //TODO update with doubly linked list + node_info* copy_list = new_list; + while(p_list->next) { p_list = p_list->next; @@ -54,10 +55,12 @@ static void linked_list_append(node_info* p_head, node_info* new_node) { if (!p_head || !new_node) return; + node_info* p_head_temp = p_head; while (p_head->next) p_head_temp = p_head_temp->next; - p_head->next = NULL; //sanity check + + p_head->next = NULL; p_head_temp->next = p_head; } diff --git a/deon-win/deon/linked_list/linked_list.h b/deon-win/deon/linked_list/linked_list.h index 4260885..6ec7442 100644 --- a/deon-win/deon/linked_list/linked_list.h +++ b/deon-win/deon/linked_list/linked_list.h @@ -3,7 +3,7 @@ #include "../types.h" void free_linked_list(node_info *p_list); -node_info *copy_linked_list(node_info *p_list); +node_info *shallow_copy_linked_list(node_info *p_list); void linked_list_append(node_info* p_head, node_info* new_node); bool linked_list_remove(node_info* p_head, node_info* delete_node); #endif diff --git a/deon-win/deon/logic/logic.c b/deon-win/deon/logic/logic.c index 33a4880..a388f07 100644 --- a/deon-win/deon/logic/logic.c +++ b/deon-win/deon/logic/logic.c @@ -8,13 +8,31 @@ */ static logic* create_logic(logic_type type, node_info* stmt_list, char* var_name) { - logic* new_logic = malloc(sizeof(logic)); - if (!new_logic || !stmt_list || !var_name) + if (!stmt_list || !var_name) return NULL; - memset(new_logic, NULL, sizeof(*new_logic)); + logic* new_logic = malloc(sizeof(logic)); new_logic->type = type; new_logic->condition_var = var_name; new_logic->stmt_list = stmt_list; return new_logic; +} + +/* + Author: xerox + Updated: 1/19/2020 + + create logic node (logical expression) +*/ +static node_info* create_logic_node(logic* logic_expr) +{ + if (!logic_expr) + return NULL; + + node_info* new_node = malloc(sizeof(node_info)); + new_node->operation = LOGIC_OPERATION; + new_node->logical_expr = logic_expr; + new_node->statement_list = NULL; + new_node->next = NULL; + return new_node; } \ No newline at end of file diff --git a/deon-win/deon/logic/logic.h b/deon-win/deon/logic/logic.h index 14172a2..893547d 100644 --- a/deon-win/deon/logic/logic.h +++ b/deon-win/deon/logic/logic.h @@ -2,4 +2,5 @@ #define LOGIC_H #include "../types.h" logic* create_logic(logic_type type, node_info* stmt_list, char* var_name); +node_info* create_logic_node(logic* logic_expr); #endif \ No newline at end of file diff --git a/deon-win/deon/parser/parser.c b/deon-win/deon/parser/parser.c index b9067f5..e0f092f 100644 --- a/deon-win/deon/parser/parser.c +++ b/deon-win/deon/parser/parser.c @@ -2,72 +2,6 @@ #define PARSER_C #include "parser.h" -/* - Author: xerox - Updated: 1/19/2020 - - create variable given name, value, and type. -*/ -static node_info* create_variable_const(char* p_name, void* value, variable_type var_type) -{ - node_info* new_node = malloc(sizeof(*new_node)); - if (!new_node) - return NULL; - memset(new_node, NULL, sizeof(*new_node)); - variable* new_var = make_variable(p_name, value, var_type); - if (!new_var) - return NULL; - new_node->assignment = (assignment_operation*)malloc(sizeof(assignment_operation)); - if (!new_node->assignment) - return NULL; - memset(new_node->assignment, NULL, sizeof(*new_node->assignment)); - new_node->operation = ASSIGNMENT_OPERATION; - new_node->operation_type.assignment = ASSIGN_FROM_CONST; - new_node->assignment->var = new_var; - return new_node; -} - -/* - Author: xerox - Updated: 1/20/2020 - - Move value from one variable to another. -*/ -static node_info* move_value(char* to, char* from) -{ - node_info* new_node = (node_info *)malloc(sizeof(node_info)); - if (!from || !new_node || !to) - return NULL; - memset(new_node, NULL, sizeof(*new_node)); - new_node->assignment = (assignment_operation*)malloc(sizeof(*new_node->assignment)); - if (!new_node->assignment) - return NULL; - memset(new_node->assignment, NULL, sizeof(*new_node->assignment)); - new_node->operation = ASSIGNMENT_OPERATION; - new_node->operation_type.assignment = ASSIGN_FROM_VAR; - new_node->assignment->from = from; - new_node->assignment->to = to; - return new_node; -} - -/* - Author: xerox - Updated: 1/19/2020 - - create logic node (logical expression) -*/ -static node_info* create_logic_node(logic* logic_expr) -{ - node_info* new_node = malloc(sizeof(node_info)); - if (!new_node || !logic_expr) - return NULL; - - memset(new_node, NULL, sizeof(*new_node)); - new_node->operation = LOGIC_OPERATION; - new_node->logical_expr = logic_expr; - return new_node; -} - /* Author: xerox Updated: 1/20/2020 @@ -89,17 +23,20 @@ static void exec_stmt(node_info *exec_node) switch (exec_node->operation_type.assignment) { case ASSIGN_FROM_CONST: - add_var(exec_node->assignment->var->name, exec_node->assignment->var->value, _var_map); + add_var( + exec_node->assignment->var->name, + exec_node->assignment->var->value, + _var_map + ); break; case ASSIGN_FROM_VAR: add_var(exec_node->assignment->to, - get_value(exec_node->assignment->from, _var_map), _var_map); + get_value(exec_node->assignment->from, _var_map), + _var_map + ); break; default: - ; -#if DEON_DEBUGGING - printf("[error] unkown assignment operation: 0x%x", exec_node->operation_type.assignment); -#endif + break; } break; case LOGIC_OPERATION: @@ -108,10 +45,12 @@ static void exec_stmt(node_info *exec_node) { case IF_LOGIC: { - variable_values* p_var_values = get_value(exec_node->logical_expr->condition_var, _var_map); - if (!p_var_values) - return; - if (*(unsigned char*)p_var_values->data_ptr) + variable_values* p_var_values = get_value( + exec_node->logical_expr->condition_var, + _var_map + ); + + if (p_var_values && *(unsigned char*)p_var_values->data_ptr) exec_stmt(exec_node->logical_expr->stmt_list); break; } @@ -120,6 +59,7 @@ static void exec_stmt(node_info *exec_node) variable_values* p_var_values = get_value(exec_node->logical_expr->condition_var, _var_map); if (!p_var_values) return; + while (*(unsigned char*)p_var_values->data_ptr) { exec_stmt(exec_node->logical_expr->stmt_list); @@ -128,10 +68,7 @@ static void exec_stmt(node_info *exec_node) break; } default: - ; -#if DEON_DEBUGGING - printf("[error] unknown logic operation\n"); -#endif + break; } } // execute statement list. @@ -139,6 +76,7 @@ static void exec_stmt(node_info *exec_node) { if(exec_node->statement_list) exec_node = exec_node->statement_list; + while (exec_node->next) { exec_node = exec_node->next; @@ -153,6 +91,7 @@ static void exec_stmt(node_info *exec_node) { case PRINT_CONSTANT: { + // TODO replace with puts to add more modularity switch (exec_node->print_expr->type) { case VAR_STRING: @@ -170,10 +109,7 @@ static void exec_stmt(node_info *exec_node) case VAR_VOID: //TODO add void variable type break; default: - ; -#if DEON_DEBUGGING - printf("[error] unable to print variable of type: 0x%x\n", exec_node->print_expr->type); -#endif + break; } break; } @@ -197,18 +133,12 @@ static void exec_stmt(node_info *exec_node) case VAR_VOID: //TODO add void variable type break; default: - ; -#if DEON_DEBUGGING - printf("[error] unable to print variable of type: 0x%x\n", p_var->type); -#endif + break; } break; } default: - ; -#if DEON_DEBUGGING - printf("[error] unknown print type: 0x%x\n", exec_node->operation_type.print); -#endif + break; } break; } @@ -240,18 +170,12 @@ static void exec_stmt(node_info *exec_node) break; } default: - ; -#if DEON_DEBUGGING - printf("[error] unknown function operation: 0x%x\n", exec_node->operation_type.func); -#endif + break; } break; } default: - ; -#if DEON_DEBUGGING - printf("[error] unknown operation: 0x%x\n", exec_node->operation); -#endif + break; } } #endif \ No newline at end of file diff --git a/deon-win/deon/parser/parser.h b/deon-win/deon/parser/parser.h index 7e86635..503aecf 100644 --- a/deon-win/deon/parser/parser.h +++ b/deon-win/deon/parser/parser.h @@ -2,8 +2,5 @@ #define PARSER_H #include "../types.h" #include "../vars/vars.h" -node_info* create_variable_const(char* p_name, void* value, variable_type var_type); -node_info* move_value(char* to, char* from); -node_info* create_logic_node(logic* logic_expr); void exec_stmt(node_info *exec_node); #endif diff --git a/deon-win/deon/print/print.c b/deon-win/deon/print/print.c index ee82467..c3d06c6 100644 --- a/deon-win/deon/print/print.c +++ b/deon-win/deon/print/print.c @@ -9,20 +9,19 @@ creates a print statement given variable type and value. */ -static node_info *create_print_statement(variable_type operation, void* value) +static node_info* create_print_statement(variable_type operation, void* value) { - node_info* new_print_stmt = (node_info*)malloc(sizeof(node_info)); - print* new_print = malloc(sizeof(print)); - if (!new_print_stmt || !new_print) + if (!value) return NULL; - memset(new_print_stmt, NULL, sizeof(*new_print_stmt)); - memset(new_print, NULL, sizeof(*new_print)); + node_info* new_print_stmt = (node_info*)malloc(sizeof(node_info)); + print* new_print = malloc(sizeof(print)); new_print_stmt->operation = PRINT_OPERATION; new_print_stmt->operation_type.print = PRINT_CONSTANT; new_print->type = operation; new_print->value = value; new_print_stmt->print_expr = new_print; + new_print_stmt->statement_list = NULL; new_print_stmt->next = NULL; return new_print_stmt; } @@ -35,19 +34,16 @@ static node_info *create_print_statement(variable_type operation, void* value) */ static node_info* create_print_variable(char* var_name) { - node_info* new_print_stmt = (node_info*)malloc(sizeof(node_info)); - if (!new_print_stmt || !var_name) + if (!var_name) return NULL; - memset(new_print_stmt, NULL, sizeof(*new_print_stmt)); + node_info* new_print_stmt = (node_info*)malloc(sizeof(node_info)); new_print_stmt->var = malloc(sizeof(variable)); - if (!new_print_stmt->var) - return NULL; - memset(new_print_stmt->var, NULL, sizeof(*new_print_stmt->var)); - new_print_stmt->operation = PRINT_OPERATION; new_print_stmt->operation_type.print = PRINT_VARIABLE; new_print_stmt->var->name = var_name; + + new_print_stmt->statement_list = NULL; new_print_stmt->next = NULL; return new_print_stmt; } diff --git a/deon-win/deon/vars/vars.c b/deon-win/deon/vars/vars.c index cdad775..f0b821d 100644 --- a/deon-win/deon/vars/vars.c +++ b/deon-win/deon/vars/vars.c @@ -8,7 +8,7 @@ add var to hashmap of variables. */ -static void add_var(char *p_name, variable_values *p_values, map_void_t* p_var_map) +static void add_var(char* p_name, variable_values* p_values, map_void_t* p_var_map) { if (!p_name || !p_values) return; @@ -22,7 +22,7 @@ static void add_var(char *p_name, variable_values *p_values, map_void_t* p_var_m get value given name and hashmap. */ -static variable_values* get_value(char *p_name, map_void_t* p_var_map) +static variable_values* get_value(char* p_name, map_void_t* p_var_map) { if (!p_name) return NULL; @@ -35,15 +35,13 @@ static variable_values* get_value(char *p_name, map_void_t* p_var_map) makes a variable struct and define it. */ -static variable* make_variable(char *p_name, void* value, variable_type var_type) +static variable* make_variable(char* p_name, void* value, variable_type var_type) { - variable *new_var = malloc(sizeof(variable)); - variable_values *new_value = malloc(sizeof(variable_values)); - if (!new_var || !new_value || !p_name || !value) + if (!p_name || !value) return NULL; - memset(new_var, NULL, sizeof(*new_var)); - memset(new_value, NULL, sizeof(*new_value)); + variable* new_var = malloc(sizeof(variable)); + variable_values* new_value = malloc(sizeof(variable_values)); new_value->type = var_type; new_value->data_ptr = value; new_var->name = p_name; @@ -59,23 +57,20 @@ static variable* make_variable(char *p_name, void* value, variable_type var_type */ static void* alloc_value(void* value, variable_type var_type) { + if (!value) + return NULL; + switch (var_type) { case VAR_INT: { - int* p_int = (int*)malloc(sizeof(int)); - if (!p_int) - return NULL; - memset(p_int, NULL, sizeof(*p_int)); + int* p_int = malloc(sizeof(int)); *p_int = *(int*)value; return p_int; } case VAR_SHORT: { - short* p_short = (short*)malloc(sizeof(short)); - if (!p_short) - return NULL; - memset(p_short, NULL, sizeof(*p_short)); + short* p_short = malloc(sizeof(short)); *p_short = *(short*)value; return p_short; } @@ -91,9 +86,6 @@ static void* alloc_value(void* value, variable_type var_type) case VAR_DOUBLE: { double* p_double = malloc(sizeof(double)); - if (!p_double) - return NULL; - memset(p_double, NULL, sizeof(*p_double)); *p_double = *(double*)value; return p_double; } @@ -101,4 +93,48 @@ static void* alloc_value(void* value, variable_type var_type) return NULL; } } + +/* + Author: xerox + Updated: 1/19/2020 + + create variable given name, value, and type. +*/ +static node_info* create_variable(char* p_name, void* value, variable_type var_type) +{ + if (!p_name || !value) + return NULL; + + node_info* new_node = malloc(sizeof(node_info)); + variable* new_var = make_variable(p_name, value, var_type); + new_node->assignment = malloc(sizeof(assignment_operation)); + new_node->operation = ASSIGNMENT_OPERATION; + new_node->operation_type.assignment = ASSIGN_FROM_CONST; + new_node->assignment->var = new_var; + new_node->statement_list = NULL; + new_node->next = NULL; + return new_node; +} + +/* + Author: xerox + Updated: 1/20/2020 + + Move value from one variable to another. +*/ +static node_info* move_value(char* to, char* from) +{ + if (!from || !to) + return NULL; + + node_info* new_node = malloc(sizeof(node_info)); + new_node->assignment = malloc(sizeof(*new_node->assignment)); + new_node->operation = ASSIGNMENT_OPERATION; + new_node->operation_type.assignment = ASSIGN_FROM_VAR; + new_node->assignment->from = from; + new_node->assignment->to = to; + new_node->statement_list = NULL; + new_node->next = NULL; + return new_node; +} #endif \ No newline at end of file diff --git a/deon-win/deon/vars/vars.h b/deon-win/deon/vars/vars.h index dd2907f..805afe6 100644 --- a/deon-win/deon/vars/vars.h +++ b/deon-win/deon/vars/vars.h @@ -5,4 +5,6 @@ void add_var(char* name, variable_values* values, map_void_t* p_var_map); variable* make_variable(char* p_name, void* value, variable_type var_type); variable_values* get_value(char* p_name, map_void_t* p_var_map); void* alloc_value(void* value, variable_type var_type); +node_info* create_variable(char* p_name, void* value, variable_type var_type); +node_info* move_value(char* to, char* from); #endif