diff options
author | kdx <kikoodx@paranoici.org> | 2023-03-14 17:43:28 +0100 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-03-14 17:43:28 +0100 |
commit | aaa3835ffcf9460325864783f9fda81a63616289 (patch) | |
tree | 581a6f41f9cadff0103f03bb21935407ab3adaf3 | |
parent | 83affb60e9b92e584cefe804045db51e9b95b8fa (diff) | |
download | golem-aaa3835ffcf9460325864783f9fda81a63616289.tar.gz |
group creation logic
-rw-r--r-- | group.c | 33 | ||||
-rw-r--r-- | group.h | 16 | ||||
-rw-r--r-- | main.c | 4 | ||||
-rw-r--r-- | token.c | 48 | ||||
-rw-r--r-- | token.h | 12 |
5 files changed, 101 insertions, 12 deletions
@@ -0,0 +1,33 @@ +#include "group.h" +#include "token.h" +#include <stdlib.h> +#include <stdio.h> + +Token *group_create(Token **list, Token *begin, Token *end) +{ + Token *group = malloc(sizeof(Token)); + if (group == NULL) { + perror("group_create:malloc"); + return NULL; + } + group->type = TOK_GROUP; + group->group.type = GROUP_NONE; + group->group.tokens = begin; + group->next = end->next; + if (*list == begin) + *list = group; + else + for (Token *e = *list; e != NULL; e = e->next) + if (e->next == begin) { + e->next = group; + break; + } + end->next = NULL; + return group; +} + +int group_scope(Token **list) +{ + group_create(list, *list, (*list)->next->next); + return 0; +} @@ -0,0 +1,16 @@ +#pragma once + +enum { + GROUP_NONE, + GROUP_SCOPE, + GROUP_FUNCTION, + GROUP_ASSIGN, +}; + +struct Token; +typedef struct { + unsigned int type; + struct Token *tokens; +} Group; + +int group_scope(struct Token **list); @@ -2,6 +2,7 @@ #include "drain.h" #include "lexer.h" #include "token.h" +#include "group.h" #include <stdio.h> #include <stdlib.h> @@ -23,7 +24,8 @@ main(int argc, char **argv) fclose(file); Token *tokens = lexer(slice); - token_print(tokens, 1); + group_scope(&tokens); + token_print(tokens, 1, 0); token_destroy(tokens); if (slice.str != NULL) @@ -2,6 +2,7 @@ #include "slice.h" #include <stdlib.h> #include <stdio.h> +#include <assert.h> Token * token_create(Slice slice, unsigned int type) @@ -17,6 +18,18 @@ token_create(Slice slice, unsigned int type) return token; } +void +token_destroy(Token *token) +{ + while (token != NULL) { + Token *next = token->next; + if (token->type == TOK_GROUP) + token_destroy(token->group.tokens); + free(token); + token = next; + } +} + Token * token_append(Token **list, Token *elem) { @@ -33,22 +46,41 @@ token_append(Token **list, Token *elem) } void -token_destroy(Token *token) +token_delete(Token **list, Token *elem) { - while (token != NULL) { - Token *next = token->next; - free(token); - token = next; + if (*list == elem) { + *list = elem->next; + free(elem); + return; + } + + Token *e = *list; + while (e != NULL) { + if (e->next == elem) { + Token *next = elem->next; + free(elem); + e->next = next; + return; + } + e = e->next; } + assert(0); // elem not found in list } Token * -token_print(Token *token, int recurse) +token_print(Token *token, int recurse, int depth) { Token *tok = token; while (token != NULL) { - printf("type: %c slice: ", (char)token->type); - slice_print(token->slice); + for (int i = 0; i < depth * 2; i++) + putchar(' '); + if (token->type == TOK_GROUP) { + printf("type: TOK_GROUP\n"); + token_print(token->group.tokens, 1, depth + 1); + } else { + printf("type: %c slice: ", (char)token->type); + slice_print(token->slice); + } if (!recurse) return tok; token = token->next; @@ -1,8 +1,10 @@ #pragma once #include "slice.h" +#include "group.h" enum { TOK_NONE = 0, + TOK_GROUP = '@', TOK_OPEN_CURL = '{', TOK_CLOS_CURL = '}', TOK_OPEN_PAREN = '(', @@ -25,12 +27,16 @@ enum { typedef struct Token Token; struct Token { - Slice slice; unsigned int type; + union { + Slice slice; + Group group; + }; Token *next; }; Token *token_create(Slice slice, unsigned int type); -Token *token_append(Token **list, Token *elem); void token_destroy(Token *token); -Token *token_print(Token *token, int recurse); +Token *token_append(Token **list, Token *elem); +void token_delete(Token **list, Token *elem); +Token *token_print(Token *token, int recurse, int depth); |