diff options
author | kdx <kdx@42l.fr> | 2023-03-14 03:36:21 +0100 |
---|---|---|
committer | kdx <kdx@42l.fr> | 2023-03-14 03:36:21 +0100 |
commit | 7425d9089802b91f31f7254adb357e07aef38007 (patch) | |
tree | 2c5340bc341a73ebda58dcacb5a6a15d94ab4ad1 | |
parent | b94b63bd30541f5311f20ac5f08f7717c3f9a672 (diff) | |
download | golem-7425d9089802b91f31f7254adb357e07aef38007.tar.gz |
flatten lexer output
-rw-r--r-- | lexer.c | 25 | ||||
-rw-r--r-- | lexer.h | 2 | ||||
-rw-r--r-- | main.c | 4 | ||||
-rw-r--r-- | token.c | 4 | ||||
-rw-r--r-- | token.h | 2 |
5 files changed, 30 insertions, 7 deletions
@@ -25,7 +25,7 @@ simple_token(char c) case ']': return TOK_CLOS_SQUAR; case '=': return TOK_ASSIGN; case ';': return TOK_END; - default: return TOK_NONE; + default: return TOK_NONE; } } @@ -38,6 +38,25 @@ slice_match(Slice slice, int (*isfun)(int c)) return slice; } +static Token * +flatten(Token *toks) +{ + int size = 0; + for (Token *t = toks; t != NULL; t = t->next) + size += 1; + Token *flat = calloc(1, sizeof(Token) * (size + 1)); + if (flat == NULL) + return NULL; + int i = 0; + for (Token *t = toks; t != NULL; t = t->next) { + flat[i] = *t; + if (i + 1 < size) + flat[i].next = flat + i + 1; + i += 1; + } + return flat; +} + Token * lexer(Slice slice) { @@ -121,5 +140,7 @@ lexer(Slice slice) printf("skipping '%c'\n", slice.str[i]); i += 1; } - return toks; + Token *flat = flatten(toks); + token_destroy(toks); + return flat; } @@ -2,5 +2,5 @@ #include "token.h" #include "slice.h" -// Return NULL on error. +// Creates an array of tokens from source slice. Return NULL on error. Token *lexer(Slice slice); @@ -23,8 +23,8 @@ main(int argc, char **argv) fclose(file); Token *tokens = lexer(slice); - token_print(tokens); - token_destroy(tokens); + token_print(tokens, 1); + free(tokens); if (slice.str != NULL) free(slice.str); @@ -43,12 +43,14 @@ token_destroy(Token *token) } Token * -token_print(Token *token) +token_print(Token *token, int recurse) { Token *tok = token; while (token != NULL) { printf("type: %c slice: ", (char)token->type); slice_print(token->slice); + if (!recurse) + return tok; token = token->next; } return tok; @@ -33,4 +33,4 @@ struct Token { 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); +Token *token_print(Token *token, int recurse); |