aboutsummaryrefslogtreecommitdiffstats
path: root/src/lexer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lexer.h')
-rwxr-xr-xsrc/lexer.h67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/lexer.h b/src/lexer.h
new file mode 100755
index 0000000..e56f5f2
--- /dev/null
+++ b/src/lexer.h
@@ -0,0 +1,67 @@
1#ifndef BDL_LEXER_H
2#define BDL_LEXER_H
3
4#include "string_view.h"
5
6typedef enum TokenType {
7 TOKEN_UNKNOWN = 0,
8
9 // Parentheses.
10 TOKEN_LPAREN,
11 TOKEN_RPAREN,
12
13 // Primitive types.
14 TOKEN_FIXNUM,
15 TOKEN_SYMBOL,
16 TOKEN_STRING,
17 TOKEN_NIL,
18 TOKEN_TRUE,
19 TOKEN_FALSE,
20
21 // End of file.
22 TOKEN_EOF,
23} TokenType;
24
25typedef struct Token {
26 TokenType type;
27 StringView value;
28 size_t line;
29 size_t column;
30} Token;
31
32typedef struct Tokens {
33 Token *tokens;
34 Errors errors;
35} Tokens;
36
37typedef struct Scanner {
38 StringView current;
39 size_t line_number;
40 size_t col_number;
41 size_t offset;
42} Scanner;
43
44// Print a token to standard output for debugging purposes.
45void print_token(Token tok);
46
47// Same functionality as the ScanView pairs, but keeping track of line and
48// column numbers.
49char scan_next(Scanner *scanner);
50char scan_peek(const Scanner *scanner);
51
52// Check if the current scanner still have characters left.
53bool scan_has_next(const Scanner *scanner);
54
55// Advance the scanner until we ran out of whitespace.
56void skip_whitespace(Scanner *scanner);
57
58// Check if a given character is a delimiter.
59bool is_delimiter(char c);
60
61// Extract the token type from the current string.
62TokenType find_primitive_type(const StringView value);
63
64// Generate a list of tokens from the given string.
65Tokens tokenize(const StringView *sv);
66
67#endif // BDL_LEXER_H