#ifndef LEXER_H #define LEXER_H #ifndef LEXER_IDEN_CAP #define LEXER_IDEN_CAP 512 #endif typedef struct lexer *lexer_t; struct token { enum token_enum { TOKEN_PARENTHS_OPEN, TOKEN_PARENTHS_CLOSE, TOKEN_SPECIAL_DOT, TOKEN_SPECIAL_QUOTE, TOKEN_LITERAL_NUM_INT, TOKEN_LITERAL_STRING, TOKEN_LITERAL_NUM_FLOAT, TOKEN_SYMBOL, TOKEN_TOKENS // number of token types } type; union { char *symbol; char *string; long num_int; float num_float }; }; struct lexer { struct token *tokens; size_t tokens_cap; size_t ntokens; // identifier char iden[LEXER_IDEN_CAP]; size_t iden_sz; int inside_string; }; // allocate a lexer with a maximum number of tokens_cap tokens // returns a lexer on success, NULL on fail lexer_t lexer_create(size_t tokens_cap); // destroy a lexer void lexer_destroy(lexer_t lexer); // turn the given non-null-terminated string str of lenght len // into into tokens // returns 0 on success int lexer_tokenize(lexer_t lexer, char *str, size_t len); #ifdef DEBUG void lexer_print_tokens(lexer_t lexer); #endif #endif