#ifndef LEXER_H #define LEXER_H #define LEXER_REGEX_WHITESPACE "\\s+" #define LEXER_REGEX_IDENTIFIER "[a-zA-Z][a-zA-Z0-9]*" #define LEXER_REGEX_KEYWORD "if|ret|func|str|arr|err|null" #define LEXER_REGEX_OPERATOR "=|==" #define LEXER_REGEX_INTEGER "[0-9]+" #define LEXER_REGEX_STRING "\\\"[^\\\"]*\\\"" #define LEXER_REGEX_COMMA "\\," #define LEXER_REGEX_OPENBRACE "\\{" #define LEXER_REGEX_CLOSEBRACE "\\}" #define LEXER_REGEX_OPENPAREN "\\(" #define LEXER_REGEX_CLOSEPAREN "\\)" typedef enum lexer_token_class { LEXER_TOKEN_WHITESPACE, LEXER_TOKEN_IDENTIFIER, LEXER_TOKEN_KEYWORD, LEXER_TOKEN_OPERATOR, LEXER_TOKEN_INTEGER, LEXER_TOKEN_STRING, LEXER_TOKEN_COMMA, LEXER_TOKEN_OPENBRACE, LEXER_TOKEN_CLOSEBRACE, LEXER_TOKEN_OPENPAREN, LEXER_TOKEN_CLOSEPAREN, LEXER_TOKEN_NONE } lexer_token_class; typedef struct lexer_token { lexer_token_class tokenClass; char* str; size_t len; } lexer_token; typedef struct lexer_tokens { lexer_token* pairs; size_t length; size_t allocd; } lexer_tokens; lexer_tokens* lexer_analyze(char* str); #endif