summaryrefslogtreecommitdiffstats
path: root/lexer.h
diff options
context:
space:
mode:
authorjdlugosz963 <jdlugosz963@gmail.com>2023-03-01 23:30:31 +0100
committerjdlugosz963 <jdlugosz963@gmail.com>2023-03-01 23:30:31 +0100
commitf44f1f8c7ef7b6266667dce76db686af3258adfc (patch)
treee0775e2a07713f1ac23d37b5271340fe8cbebd16 /lexer.h
downloadjadl-f44f1f8c7ef7b6266667dce76db686af3258adfc.tar.gz
jadl-f44f1f8c7ef7b6266667dce76db686af3258adfc.zip
Build simple abstract syntax tree
Diffstat (limited to 'lexer.h')
-rw-r--r--lexer.h65
1 files changed, 65 insertions, 0 deletions
diff --git a/lexer.h b/lexer.h
new file mode 100644
index 0000000..87fc008
--- /dev/null
+++ b/lexer.h
@@ -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
20typedef 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
32typedef struct _Token {
33 TokenType type;
34 int is_decimal_point;
35 char *value;
36 struct _Token *next;
37} Token;
38
39typedef struct _Lexer {
40 int error;
41 Token *tokens;
42} Lexer;
43
44int lexer_tokens_count(char *str);
45
46Lexer *lexer_make();
47void lexer_free(Lexer *lexer);
48Token *lexer_token_make(char *value, int value_len, TokenType type);
49Lexer *lexer_token_push(Lexer *lexer, Token *token);
50
51char *lexer_token_terminated_symbol(char *str);
52char *lexer_token_make_string(char *str, Token **token);
53char *lexer_token_make_symbol(char *str, Token **token);
54char *lexer_token_make_special(char *str, Token **token);
55char *lexer_token_make_number(char *str, Token **token);
56
57void lexer_token_make_error(char *message, Token **token);
58
59Lexer *lexer_tokenize(char *str);
60
61
62void lexer_tokens_print(Lexer *lexer);
63Lexer *lexer_tokens_reverse(Lexer *lexer);
64
65#endif