From f44f1f8c7ef7b6266667dce76db686af3258adfc Mon Sep 17 00:00:00 2001 From: jdlugosz963 Date: Wed, 1 Mar 2023 23:30:31 +0100 Subject: Build simple abstract syntax tree --- lexer.h | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 lexer.h (limited to 'lexer.h') diff --git a/lexer.h b/lexer.h new file mode 100644 index 0000000..87fc008 --- /dev/null +++ b/lexer.h @@ -0,0 +1,65 @@ +#ifndef _LEXER +#define _LEXER + +#include +#include +#include +#include +#include + +#include "types.h" +#include "memory.h" + +#define SYMBOL_NIL "nil" +#define SYMBOL_TRUE_SHORT "#t" +#define SYMBOL_TRUE "#true" +#define SYMBOL_FALSE_SHORT "#f" +#define SYMBOL_FALSE "#false" + + +typedef enum _TokenType { + TOKEN_TYPE_SYMBOL, + TOKEN_TYPE_NUMBER, + TOKEN_TYPE_STRING, + TOKEN_TYPE_TRUE, + TOKEN_TYPE_FALSE, + TOKEN_TYPE_NIL, + TOKEN_TYPE_SPECIAL, + TOKEN_TYPE_ERROR +} TokenType; + + +typedef struct _Token { + TokenType type; + int is_decimal_point; + char *value; + struct _Token *next; +} Token; + +typedef struct _Lexer { + int error; + Token *tokens; +} Lexer; + +int lexer_tokens_count(char *str); + +Lexer *lexer_make(); +void lexer_free(Lexer *lexer); +Token *lexer_token_make(char *value, int value_len, TokenType type); +Lexer *lexer_token_push(Lexer *lexer, Token *token); + +char *lexer_token_terminated_symbol(char *str); +char *lexer_token_make_string(char *str, Token **token); +char *lexer_token_make_symbol(char *str, Token **token); +char *lexer_token_make_special(char *str, Token **token); +char *lexer_token_make_number(char *str, Token **token); + +void lexer_token_make_error(char *message, Token **token); + +Lexer *lexer_tokenize(char *str); + + +void lexer_tokens_print(Lexer *lexer); +Lexer *lexer_tokens_reverse(Lexer *lexer); + +#endif -- cgit v1.2.3