#pragma once #include "slice.h" #include "group.h" enum { TOK_NONE = 0, TOK_GROUP = '@', TOK_OPEN_CURL = '{', TOK_CLOS_CURL = '}', TOK_OPEN_PAREN = '(', TOK_CLOS_PAREN = ')', TOK_OPEN_SQUAR = '[', TOK_CLOS_SQUAR = ']', TOK_ASSIGN = '=', TOK_END = ';', TOK_NUMBER = '0', TOK_CHAR = 'c', TOK_STRING = 's', TOK_WORD = 'w', TOK_KW_LET = 'L', TOK_KW_IF = 'I', TOK_KW_ELSE = 'E', TOK_KW_WHILE = 'W', TOK_KW_RETURN = 'R', }; typedef struct Token Token; struct Token { unsigned char type; union { Slice slice; Group group; }; Token *prev; Token *next; }; Token *token_create(Slice slice, unsigned int type); void token_destroy(Token *token); Token *token_append(Token **list, Token *elem); Token *token_prepend(Token **list, Token *elem); void token_delete(Token **list, Token *elem); Token *token_extract(Token **list, Token *elem); Token *token_search(Token *list, unsigned int type); Token *token_search_closing(Token *list, unsigned int type, unsigned int opn); Token *token_print(Token *token, int recurse, int depth); int token_isgroup(Token *token, unsigned int type); int token_len(Token *token); Token *token_last(Token *token);