diff options
author | kdx <kikoodx@paranoici.org> | 2023-03-14 22:33:44 +0100 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-03-14 22:33:44 +0100 |
commit | f620904bf8988f022883f5dd7474103089873670 (patch) | |
tree | 1ac4803756a3ac685f254432a6e41a167874d751 | |
parent | da38a82f202c02e0f397dcc4290dfdf2174e913a (diff) | |
download | golem-f620904bf8988f022883f5dd7474103089873670.tar.gz |
group more shit
-rw-r--r-- | group.c | 73 | ||||
-rw-r--r-- | group.h | 3 | ||||
-rw-r--r-- | main.c | 2 |
3 files changed, 54 insertions, 24 deletions
@@ -30,6 +30,40 @@ group_dec(Token **list, unsigned int tok_type, unsigned int group_type) return 0; } +static int +group_enclosed(Token **list, unsigned int open_tok, unsigned int clos_tok, + unsigned int group_type) +{ + for (;;) { + Token *begin = token_search(*list, open_tok); + Token *end = token_search_closing(begin, clos_tok, + open_tok); + if (begin == NULL && end == NULL) + break; + if (begin == NULL || end == NULL) { + fprintf(stderr, "unclosed pair\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); + if (group_scope(&group->group.tokens)) { + fprintf(stderr, "group_enclosed failed\n"); + return 1; + } + } + for (Token *e = *list; e != NULL; e = e->next) + if (e->type == TOK_GROUP) + group_enclosed(&e->group.tokens, open_tok, clos_tok, + group_type); + return 0; +} + Token * group_create(Token **list, Token *begin, Token *end) { @@ -69,28 +103,19 @@ group_global(Token **list) int group_scope(Token **list) { - for (;;) { - Token *begin = token_search(*list, 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) { - fprintf(stderr, "unclosed CURL pair\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_SCOPE; - token_delete(&group->group.tokens, begin); - token_delete(&group->group.tokens, end); - if (group_scope(&group->group.tokens)) { - fprintf(stderr, "group_scope failed\n"); - return 1; - } - } - return 0; + return group_enclosed(list, TOK_OPEN_CURL, TOK_CLOS_CURL, GROUP_SCOPE); +} + +int +group_funcall(Token **list) +{ + return group_enclosed(list, TOK_OPEN_PAREN, TOK_CLOS_PAREN, + GROUP_FUNCTION); +} + +int +group_deref(Token **list) +{ + return group_enclosed(list, TOK_OPEN_SQUAR, TOK_CLOS_SQUAR, + GROUP_DEREF); } @@ -7,6 +7,7 @@ enum { GROUP_ASSIGN = '=', GROUP_DEC_LOCAL = 'l', GROUP_DEC_GLOBAL = 'g', + GROUP_DEREF = 'd', }; struct Token; @@ -19,3 +20,5 @@ 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); +int group_funcall(struct Token **list); +int group_deref(struct Token **list); @@ -25,6 +25,8 @@ main(int argc, char **argv) Token *tokens = lexer(slice); group_scope(&tokens); + group_deref(&tokens); + group_funcall(&tokens); group_global(&tokens); group_local(&tokens); token_print(tokens, 1, 0); |