1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
#pragma once
#include <stddef.h>
typedef enum LexerToken {
LEXER_TOKEN_IDENTIFIER,
LEXER_TOKEN_KEYWORD_TYPE,
LEXER_TOKEN_KEYWORD_VOID,
LEXER_TOKEN_KEYWORD_I8,
LEXER_TOKEN_KEYWORD_U8,
LEXER_TOKEN_KEYWORD_I16,
LEXER_TOKEN_KEYWORD_U16,
LEXER_TOKEN_KEYWORD_I32,
LEXER_TOKEN_KEYWORD_U32,
LEXER_TOKEN_KEYWORD_I64,
LEXER_TOKEN_KEYWORD_U64,
LEXER_TOKEN_KEYWORD_F16,
LEXER_TOKEN_KEYWORD_F32,
LEXER_TOKEN_KEYWORD_F64,
LEXER_TOKEN_KEYWORD_F128,
LEXER_TOKEN_KEYWORD_BOOL,
LEXER_TOKEN_KEYWORD_PRINT_U64,
LEXER_TOKEN_KEYWORD_RETURN,
LEXER_TOKEN_KEYWORD_TRUE,
LEXER_TOKEN_KEYWORD_FALSE,
LEXER_TOKEN_KEYWORD_IF,
LEXER_TOKEN_KEYWORD_ELSE,
LEXER_TOKEN_NUMBER,
LEXER_TOKEN_SYMBOL,
LEXER_TOKEN_SYMBOL_EOL,
LEXER_TOKEN_SYMBOL_OPEN_PARENTHESIS,
LEXER_TOKEN_SYMBOL_CLOSE_PARENTHESIS,
LEXER_TOKEN_SYMBOL_OPEN_CURLY_BRACKET,
LEXER_TOKEN_SYMBOL_CLOSE_CURLY_BRACKET,
LEXER_TOKEN_SYMBOL_FUNCTION_ARROW,
LEXER_TOKEN_SYMBOL_COLON,
LEXER_TOKEN_SYMBOL_ASSIGN,
LEXER_TOKEN_SYMBOL_COMMA,
LEXER_TOKEN_SYMBOL_PLUS,
LEXER_TOKEN_SYMBOL_MINUS,
LEXER_TOKEN_SYMBOL_SUM,
LEXER_TOKEN_SYMBOL_SUB,
LEXER_TOKEN_SYMBOL_MULTIPLY,
LEXER_TOKEN_SYMBOL_DIVIDE,
LEXER_TOKEN_SYMBOL_MODULO,
LEXER_TOKEN_SYMBOL_EQUAL,
LEXER_TOKEN_SYMBOL_NOT_EQUAL,
LEXER_TOKEN_SYMBOL_GREATER,
LEXER_TOKEN_SYMBOL_SMALLER,
LEXER_TOKEN_SYMBOL_GREATER_OR_EQUAL,
LEXER_TOKEN_SYMBOL_SMALLER_OR_EQUAL,
LEXER_TOKEN_NONE,
} LexerToken;
extern const char *LEXER_TOKEN_STRINGS[];
extern const char *LEXER_SYMBOL_STRINGS[];
extern const LexerToken LEXER_SYMBOL_TOKENS[];
extern const size_t LEXER_SYMBOL_SIZE;
extern const char *LEXER_KEYWORD_STRINGS[];
extern const LexerToken LEXER_KEYWORD_TOKENS[];
extern const size_t LEXER_KEYWORD_SIZE;
struct ParserNode;
typedef struct LexerNode {
char *str_begin;
char *str_end;
LexerToken token;
struct ParserNode *parserNode;
} LexerNode;
typedef struct LexerNodeArray {
LexerNode *data;
size_t size;
} LexerNodeArray;
extern const LexerNodeArray LEXER_NODE_ARRAY_ERROR;
extern bool lexerNodeArrayIsError(LexerNodeArray array);
extern void lexerNodeArrayPrint(LexerNodeArray array);
extern void lexerNodeArrayDestroy(LexerNodeArray array);
extern LexerNodeArray lexer(char *str);
extern void lexerPushClear(LexerNodeArray *array, size_t *array_size,
char *iter, char **node_str_begin,
LexerToken *node_token, LexerToken token);
extern bool isIdentifier(char c);
extern bool isNumber(char c);
extern bool isSymbol(char c);
extern bool isSingleSymbol(char c);
extern bool isSpace(char c);
|