summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-03-14 17:43:28 +0100
committerkdx <kikoodx@paranoici.org>2023-03-14 17:43:28 +0100
commitaaa3835ffcf9460325864783f9fda81a63616289 (patch)
tree581a6f41f9cadff0103f03bb21935407ab3adaf3
parent83affb60e9b92e584cefe804045db51e9b95b8fa (diff)
downloadgolem-aaa3835ffcf9460325864783f9fda81a63616289.tar.gz
group creation logic
-rw-r--r--group.c33
-rw-r--r--group.h16
-rw-r--r--main.c4
-rw-r--r--token.c48
-rw-r--r--token.h12
5 files changed, 101 insertions, 12 deletions
diff --git a/group.c b/group.c
new file mode 100644
index 0000000..4d39010
--- /dev/null
+++ b/group.c
@@ -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;
+}
diff --git a/group.h b/group.h
new file mode 100644
index 0000000..5fd4c7e
--- /dev/null
+++ b/group.h
@@ -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);
diff --git a/main.c b/main.c
index 5002350..5bd22c3 100644
--- a/main.c
+++ b/main.c
@@ -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)
diff --git a/token.c b/token.c
index 11ed955..ec3bb37 100644
--- a/token.c
+++ b/token.c
@@ -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;
diff --git a/token.h b/token.h
index 2c7e5e5..204c7b9 100644
--- a/token.h
+++ b/token.h
@@ -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);