diff options
author | kdx <kikoodx@paranoici.org> | 2023-03-14 21:45:49 +0100 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-03-14 21:51:27 +0100 |
commit | 29f0cf60472ad791e4ef62460c55e213bc9d8fd2 (patch) | |
tree | a058454f3876faccaf652ad47124cacb7200cea8 | |
parent | a2222a6e270b38cdb214f5975903fef6699f61f4 (diff) | |
download | golem-29f0cf60472ad791e4ef62460c55e213bc9d8fd2.tar.gz |
group declarations
-rw-r--r-- | README.md | 3 | ||||
-rw-r--r-- | group.c | 55 | ||||
-rw-r--r-- | group.h | 13 | ||||
-rw-r--r-- | main.c | 2 | ||||
-rw-r--r-- | mvp.golem | 3 |
5 files changed, 65 insertions, 11 deletions
@@ -11,6 +11,7 @@ Work in progress bytecode language created by and for [kdx](https://kdx.re). // Global scope is initialized to zero. global g_heap; +global g_another g_one; main(argc argv) { local hello; @@ -43,6 +44,8 @@ strdup(str) { i = 0; while (lesseq i [str 0]) { + local smile please; + [dest i] = [str i]; i = (add i 1); } @@ -3,7 +3,32 @@ #include <stdlib.h> #include <stdio.h> -Token *group_create(Token **list, Token *begin, Token *end) +static int +group_dec(Token **list, unsigned int tok_type, unsigned int group_type) +{ + for (;;) { + Token *begin = token_search(*list, tok_type); + if (begin == NULL) + break; + Token *end = token_search(begin, TOK_END); + if (end == NULL) { + fprintf(stderr, "ill formed declaration\n"); + return 1; + } + Token *group = group_create(list, begin, end); + if (group == NULL) { + fprintf(stderr, "group_create failed\n"); + return 1; + } + group->group.type = group_type; + token_delete(&group->group.tokens, begin); + token_delete(&group->group.tokens, end); + } + return 0; +} + +Token * +group_create(Token **list, Token *begin, Token *end) { Token *group = malloc(sizeof(Token)); if (group == NULL) { @@ -15,20 +40,36 @@ Token *group_create(Token **list, Token *begin, Token *end) group->group.tokens = begin; group->prev = begin->prev; group->next = end->next; - if (*list == begin) - *list = group; - else - begin->prev->next = group; begin->prev = NULL; end->next = NULL; + if (*list == begin) + *list = group; + else if (group->prev != NULL) + group->prev->next = group; + if (group->next != NULL) + group->next->prev = group; return group; } -int group_scope(Token **list) +int +group_local(Token **list) +{ + return group_dec(list, TOK_KW_LOCAL, GROUP_DEC_LOCAL); +} + +int +group_global(Token **list) +{ + return group_dec(list, TOK_KW_GLOBAL, GROUP_DEC_GLOBAL); +} + +int +group_scope(Token **list) { for (;;) { Token *begin = token_search(*list, TOK_OPEN_CURL); - Token *end = token_search_closing(*list, TOK_CLOS_CURL, TOK_OPEN_CURL); + Token *end = token_search_closing(begin, TOK_CLOS_CURL, + TOK_OPEN_CURL); if (begin == NULL && end == NULL) return 0; if (begin == NULL || end == NULL) { @@ -1,10 +1,12 @@ #pragma once enum { - GROUP_NONE = 0, - GROUP_SCOPE = 's', - GROUP_FUNCTION = 'f', - GROUP_ASSIGN = '=', + GROUP_NONE = 0, + GROUP_SCOPE = 's', + GROUP_FUNCTION = 'f', + GROUP_ASSIGN = '=', + GROUP_DEC_LOCAL = 'l', + GROUP_DEC_GLOBAL = 'g', }; struct Token; @@ -13,4 +15,7 @@ typedef struct { struct Token *tokens; } Group; +struct Token *group_create(struct Token **l, struct Token *b, struct Token *e); +int group_local(struct Token **list); +int group_global(struct Token **list); int group_scope(struct Token **list); @@ -24,6 +24,8 @@ main(int argc, char **argv) fclose(file); Token *tokens = lexer(slice); + group_global(&tokens); + group_local(&tokens); group_scope(&tokens); token_print(tokens, 1, 0); token_destroy(tokens); @@ -4,6 +4,7 @@ // Global scope is initialized to zero. global g_heap; +global g_another g_one; main(argc argv) { local hello; @@ -36,6 +37,8 @@ strdup(str) { i = 0; while (lesseq i [str 0]) { + local smile please; + [dest i] = [str i]; i = (add i 1); } |