diff options
author | kdx <kikoodx@paranoici.org> | 2023-03-15 22:36:46 +0100 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-03-15 23:15:59 +0100 |
commit | 48040131e60465c118c6e89161359662d1ddea94 (patch) | |
tree | 4784f9e437a4535aead00c19bb9368ca1094bcfb | |
parent | 935b4cc11ddebd350af76f498416c0a25b83f837 (diff) | |
download | golem-48040131e60465c118c6e89161359662d1ddea94.tar.gz |
group tokens into atoms
-rw-r--r-- | group.c | 28 | ||||
-rw-r--r-- | group.h | 2 | ||||
-rw-r--r-- | main.c | 1 | ||||
-rwxr-xr-x | test.sh | 3 |
4 files changed, 33 insertions, 1 deletions
@@ -66,3 +66,31 @@ group_scope(Token **list) { return group_enclosed(list, TOK_OPEN_CURL, TOK_CLOS_CURL, GROUP_SCOPE); } + +int +group_atom(Token **list) +{ + // Recurse in child GROUP_SCOPEs. + for (Token *e = *list; e != NULL; e = e->next) + if (e->type == TOK_GROUP && e->group.type == GROUP_SCOPE) + if (group_atom(&e->group.tokens)) + return 1; + + Token *e = *list; + for (;;) { + Token *end = token_search(e, TOK_END); + if (end == NULL) + break; + if (end != *list) { + Token *group = group_create(list, e, end->prev); + if (group == NULL) { + fprintf(stderr, "group_create failed\n"); + return 1; + } + group->group.type = GROUP_ATOM; + e = end->next; + } + token_delete(list, end); + } + return 0; +} @@ -3,6 +3,7 @@ enum { GROUP_NONE = 0, GROUP_SCOPE = 's', + GROUP_ATOM = 'a', GROUP_FUNCTION = 'f', GROUP_ASSIGN = '=', GROUP_DEC_LOCAL = 'l', @@ -18,3 +19,4 @@ typedef struct { struct Token *group_create(struct Token **l, struct Token *b, struct Token *e); int group_scope(struct Token **list); +int group_atom(struct Token **list); @@ -35,6 +35,7 @@ main(int argc, char **argv) if (tokens != NULL) { destroy_duplicates(&tokens, TOK_END); group_scope(&tokens); + group_atom(&tokens); token_print(tokens, 1, 0); token_destroy(tokens); } @@ -1,4 +1,5 @@ #!/bin/sh ./build.sh || exit 1 ./golem /dev/null || exit 1 -valgrind ./golem mvp.golem || exit 1 +./golem onlymain.golem || exit 1 +valgrind ./golem mvp.golem >/dev/null || exit 1 |