diff options
author | kdx <kdx@42l.fr> | 2023-03-14 00:55:13 +0100 |
---|---|---|
committer | kdx <kdx@42l.fr> | 2023-03-14 00:55:13 +0100 |
commit | c8dbf66087ac618299dfff435ba0381588d184c3 (patch) | |
tree | c91658537c073f5f27bd56e46cee8f952b7d0784 | |
parent | 94381fd0fdaed4030b5d6661ad7d342fc4994847 (diff) | |
download | golem-c8dbf66087ac618299dfff435ba0381588d184c3.tar.gz |
lexer scaffolding
-rw-r--r-- | lexer.c | 12 | ||||
-rw-r--r-- | lexer.h | 6 | ||||
-rw-r--r-- | main.c | 4 | ||||
-rw-r--r-- | token.c | 42 | ||||
-rw-r--r-- | token.h | 25 |
5 files changed, 89 insertions, 0 deletions
@@ -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; +} @@ -0,0 +1,6 @@ +#pragma once +#include "token.h" +#include "slice.h" + +// Return NULL on error. +Token *lexer(Slice slice); @@ -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; } @@ -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; + } +} @@ -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); |