diff options
author | jdlugosz963 <jdlugosz963@gmail.com> | 2023-03-01 23:30:31 +0100 |
---|---|---|
committer | jdlugosz963 <jdlugosz963@gmail.com> | 2023-03-01 23:30:31 +0100 |
commit | f44f1f8c7ef7b6266667dce76db686af3258adfc (patch) | |
tree | e0775e2a07713f1ac23d37b5271340fe8cbebd16 /lexer.h | |
download | jadl-f44f1f8c7ef7b6266667dce76db686af3258adfc.tar.gz jadl-f44f1f8c7ef7b6266667dce76db686af3258adfc.zip |
Build simple abstract syntax tree
Diffstat (limited to 'lexer.h')
-rw-r--r-- | lexer.h | 65 |
1 files changed, 65 insertions, 0 deletions
@@ -0,0 +1,65 @@ | |||
1 | #ifndef _LEXER | ||
2 | #define _LEXER | ||
3 | |||
4 | #include <stddef.h> | ||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include <string.h> | ||
8 | #include <ctype.h> | ||
9 | |||
10 | #include "types.h" | ||
11 | #include "memory.h" | ||
12 | |||
13 | #define SYMBOL_NIL "nil" | ||
14 | #define SYMBOL_TRUE_SHORT "#t" | ||
15 | #define SYMBOL_TRUE "#true" | ||
16 | #define SYMBOL_FALSE_SHORT "#f" | ||
17 | #define SYMBOL_FALSE "#false" | ||
18 | |||
19 | |||
20 | typedef enum _TokenType { | ||
21 | TOKEN_TYPE_SYMBOL, | ||
22 | TOKEN_TYPE_NUMBER, | ||
23 | TOKEN_TYPE_STRING, | ||
24 | TOKEN_TYPE_TRUE, | ||
25 | TOKEN_TYPE_FALSE, | ||
26 | TOKEN_TYPE_NIL, | ||
27 | TOKEN_TYPE_SPECIAL, | ||
28 | TOKEN_TYPE_ERROR | ||
29 | } TokenType; | ||
30 | |||
31 | |||
32 | typedef struct _Token { | ||
33 | TokenType type; | ||
34 | int is_decimal_point; | ||
35 | char *value; | ||
36 | struct _Token *next; | ||
37 | } Token; | ||
38 | |||
39 | typedef struct _Lexer { | ||
40 | int error; | ||
41 | Token *tokens; | ||
42 | } Lexer; | ||
43 | |||
44 | int lexer_tokens_count(char *str); | ||
45 | |||
46 | Lexer *lexer_make(); | ||
47 | void lexer_free(Lexer *lexer); | ||
48 | Token *lexer_token_make(char *value, int value_len, TokenType type); | ||
49 | Lexer *lexer_token_push(Lexer *lexer, Token *token); | ||
50 | |||
51 | char *lexer_token_terminated_symbol(char *str); | ||
52 | char *lexer_token_make_string(char *str, Token **token); | ||
53 | char *lexer_token_make_symbol(char *str, Token **token); | ||
54 | char *lexer_token_make_special(char *str, Token **token); | ||
55 | char *lexer_token_make_number(char *str, Token **token); | ||
56 | |||
57 | void lexer_token_make_error(char *message, Token **token); | ||
58 | |||
59 | Lexer *lexer_tokenize(char *str); | ||
60 | |||
61 | |||
62 | void lexer_tokens_print(Lexer *lexer); | ||
63 | Lexer *lexer_tokens_reverse(Lexer *lexer); | ||
64 | |||
65 | #endif | ||