summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-03-14 22:33:44 +0100
committerkdx <kikoodx@paranoici.org>2023-03-14 22:33:44 +0100
commitf620904bf8988f022883f5dd7474103089873670 (patch)
tree1ac4803756a3ac685f254432a6e41a167874d751
parentda38a82f202c02e0f397dcc4290dfdf2174e913a (diff)
downloadgolem-f620904bf8988f022883f5dd7474103089873670.tar.gz
group more shit
-rw-r--r--group.c73
-rw-r--r--group.h3
-rw-r--r--main.c2
3 files changed, 54 insertions, 24 deletions
diff --git a/group.c b/group.c
index 81c958c..34640d7 100644
--- a/group.c
+++ b/group.c
@@ -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);
}
diff --git a/group.h b/group.h
index cd3c9b2..530f16f 100644
--- a/group.h
+++ b/group.h
@@ -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);
diff --git a/main.c b/main.c
index 2c14af2..36b2145 100644
--- a/main.c
+++ b/main.c
@@ -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);