#ifndef TSL_TOKENIZER_H #define TSL_TOKENIZER_H #include "string_view.h" typedef enum { TSL_TOKEN_END_OF_FILE, TSL_TOKEN_UNEXPECTED_SYMBOL, TSL_TOKEN_IDENTIFIER, TSL_TOKEN_STRING, TSL_TOKEN_NUM, TSL_TOKEN_BOOL, TSL_TOKEN_NULL, TSL_TOKEN_EQUAL, TSL_TOKEN_LBRACE, TSL_TOKEN_RBRACE, TSL_TOKEN_LBRACKET, TSL_TOKEN_RBRACKET, TSL_TOKEN_LPAREN, TSL_TOKEN_RPAREN, TSL_TOKEN_COLON, TSL_TOKEN_COMMA, TSL_TOKEN_FN, TSL_TOKEN_DOLLAR_SIGN, TSL_TOKEN_ARITHMETIC } TslToken; typedef enum { TSL_COMMAND_TOKEN_END_OF_FILE, TSL_COMMAND_TOKEN_ARG, TSL_COMMAND_TOKEN_END } TslCommandToken; typedef struct { TslToken token; size_t code_index; size_t prev_code_index; } TslTokenizerPeek; typedef struct { char *code; size_t code_size; size_t code_index; size_t prev_code_index; TslTokenizerPeek peek; TslStringView identifier; TslStringView string; int bool_value; double number_value; char arithmetic_symbol; } TslTokenizer; void tsl_tokenizer_init(TslTokenizer *self, char *code, size_t code_size); TslToken tsl_tokenizer_next(TslTokenizer *self); int tsl_tokenizer_accept(TslTokenizer *self, TslToken expected_token); /* If peek was previously called without consuming the token, then the previous value peek token is returned. In other words, calling tsl_tokenizer_peek twice in a row will return the same token without progressing. */ TslToken tsl_tokenizer_peek(TslTokenizer *self); TslToken tsl_tokenizer_consume_peek(TslTokenizer *self); TslCommandToken tsl_tokenizer_next_command_arg(TslTokenizer *self, TslStringView *arg); int tsl_tokenizer_get_line_by_index(TslTokenizer *self, size_t index); #endif /* TSL_TOKENIZER_H */