summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kdx@42l.fr>2023-03-14 00:55:13 +0100
committerkdx <kdx@42l.fr>2023-03-14 00:55:13 +0100
commitc8dbf66087ac618299dfff435ba0381588d184c3 (patch)
treec91658537c073f5f27bd56e46cee8f952b7d0784
parent94381fd0fdaed4030b5d6661ad7d342fc4994847 (diff)
downloadgolem-c8dbf66087ac618299dfff435ba0381588d184c3.tar.gz
lexer scaffolding
-rw-r--r--lexer.c12
-rw-r--r--lexer.h6
-rw-r--r--main.c4
-rw-r--r--token.c42
-rw-r--r--token.h25
5 files changed, 89 insertions, 0 deletions
diff --git a/lexer.c b/lexer.c
new file mode 100644
index 0000000..47bd816
--- /dev/null
+++ b/lexer.c
@@ -0,0 +1,12 @@
+#include "lexer.h"
+#include "slice.h"
+#include "token.h"
+#include <stdlib.h>
+
+Token *
+lexer(Slice slice)
+{
+ Token *toks = NULL;
+ token_append(&toks, token_create(slice, TOK_STRING));
+ return toks;
+}
diff --git a/lexer.h b/lexer.h
new file mode 100644
index 0000000..5a9efa9
--- /dev/null
+++ b/lexer.h
@@ -0,0 +1,6 @@
+#pragma once
+#include "token.h"
+#include "slice.h"
+
+// Return NULL on error.
+Token *lexer(Slice slice);
diff --git a/main.c b/main.c
index 5862053..f3fff23 100644
--- a/main.c
+++ b/main.c
@@ -1,5 +1,7 @@
#include "slice.h"
#include "drain.h"
+#include "lexer.h"
+#include "token.h"
#include <stdio.h>
#include <stdlib.h>
@@ -23,5 +25,7 @@ main(int argc, char **argv)
if (slice.str != NULL)
free(slice.str);
+ Token *tokens = lexer(slice);
+ token_destroy(tokens);
return 0;
}
diff --git a/token.c b/token.c
new file mode 100644
index 0000000..f025004
--- /dev/null
+++ b/token.c
@@ -0,0 +1,42 @@
+#include "token.h"
+#include <stdlib.h>
+#include <stdio.h>
+
+Token *
+token_create(Slice slice, unsigned int type)
+{
+ Token *token = malloc(sizeof(Token));
+ if (token == NULL) {
+ perror("token_create:malloc");
+ return NULL;
+ }
+ token->slice = slice;
+ token->type = type;
+ token->next = NULL;
+ return token;
+}
+
+Token *
+token_append(Token **list, Token *elem)
+{
+ if (*list == NULL) {
+ *list = elem;
+ return *list;
+ }
+
+ Token *end = *list;
+ while (end->next != NULL)
+ end = end->next;
+ end->next = elem;
+ return *list;
+}
+
+void
+token_destroy(Token *token)
+{
+ while (token != NULL) {
+ Token *next = token->next;
+ free(token);
+ token = next;
+ }
+}
diff --git a/token.h b/token.h
new file mode 100644
index 0000000..d3f63e5
--- /dev/null
+++ b/token.h
@@ -0,0 +1,25 @@
+#pragma once
+#include "slice.h"
+
+enum {
+ TOK_NONE,
+ TOK_OPEN_CURL,
+ TOK_CLOS_CURL,
+ TOK_OPEN_PAREN,
+ TOK_CLOS_PAREN,
+ TOK_NUMBER,
+ TOK_CHARACTER,
+ TOK_STRING,
+ TOK_WORD,
+};
+
+typedef struct Token Token;
+struct Token {
+ Slice slice;
+ unsigned int type;
+ Token *next;
+};
+
+Token *token_create(Slice slice, unsigned int type);
+Token *token_append(Token **list, Token *elem);
+void token_destroy(Token *token);