#ifndef LEXER_H #define LEXER_H #include "value.h" #ifndef LEXER_IDEN_CAP #define LEXER_IDEN_CAP 512 #endif #ifndef LEXER_TOK_CAP #define LEXER_TOK_CAP 8192 #endif typedef struct lexer *lexer_t; typedef struct toklist toklist_t; struct token { enum token_enum { TOKEN_PARENTHS_OPEN, TOKEN_PARENTHS_CLOSE, TOKEN_SPECIAL_QUOTE, TOKEN_VALUE, TOKEN_TOKENS // number of token types } type; value_t value; }; struct toklist { struct token tokens[LEXER_TOK_CAP]; size_t ntokens; }; struct lexer { char iden[LEXER_IDEN_CAP]; // identifier size_t iden_sz; bool inside_string; int scope_depth; }; // returns a lexer on success and NULL on fail lexer_t lexer_create(); // deallocate a lexer void lexer_destroy(lexer_t lexer); // reset to its default state without destroying it void lexer_reset(lexer_t lexer); void toklist_reset(toklist_t *toklist); // self explanatory void toklist_print(toklist_t *toklist); // turn the given non-null-terminated string str of lenght len // into into tokens // returns 0 on success int lexer_tokenize(lexer_t lexer, toklist_t *toklist, char *str, size_t len); // checks whether the lexer has finished (temp buffers like iden are empty) // returns 1 on finished, 0 on not finished bool lexer_has_finished(lexer_t lexer); #endif