summaryrefslogtreecommitdiff
path: root/src/compiler/lexer.h
blob: 0a6da3aae52335f0c1babe313dab15befbba92c9 (plain)
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);