summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-03-15 22:36:46 +0100
committerkdx <kikoodx@paranoici.org>2023-03-15 23:15:59 +0100
commit48040131e60465c118c6e89161359662d1ddea94 (patch)
tree4784f9e437a4535aead00c19bb9368ca1094bcfb
parent935b4cc11ddebd350af76f498416c0a25b83f837 (diff)
downloadgolem-48040131e60465c118c6e89161359662d1ddea94.tar.gz
group tokens into atoms
-rw-r--r--group.c28
-rw-r--r--group.h2
-rw-r--r--main.c1
-rwxr-xr-xtest.sh3
4 files changed, 33 insertions, 1 deletions
diff --git a/group.c b/group.c
index 7c690d8..16f2642 100644
--- a/group.c
+++ b/group.c
@@ -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;
+}
diff --git a/group.h b/group.h
index 0cb8bfa..051d9b5 100644
--- a/group.h
+++ b/group.h
@@ -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);
diff --git a/main.c b/main.c
index 30bd58e..5333e70 100644
--- a/main.c
+++ b/main.c
@@ -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);
}
diff --git a/test.sh b/test.sh
index f53f967..0ded8c7 100755
--- a/test.sh
+++ b/test.sh
@@ -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