diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-29 19:11:40 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-29 19:11:40 +0200 |
commit | 5ed73b695e6b463149ab0c9ae3eccb26a4ec5807 (patch) | |
tree | 01aa089934d1b49fe515fe86fffca01c471c69e9 /src/parser.h | |
parent | e73a4c16a2269cdb2f5e7d66fb9839e4c44e14de (diff) | |
download | bdl-5ed73b695e6b463149ab0c9ae3eccb26a4ec5807.tar.gz bdl-5ed73b695e6b463149ab0c9ae3eccb26a4ec5807.zip |
Add parser for tokens->ast conversion
Diffstat (limited to 'src/parser.h')
-rwxr-xr-x | src/parser.h | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/parser.h b/src/parser.h new file mode 100755 index 0000000..ee5febe --- /dev/null +++ b/src/parser.h | |||
@@ -0,0 +1,84 @@ | |||
1 | #ifndef BDL_PARSER_H | ||
2 | #define BDL_PARSER_H | ||
3 | |||
4 | #include "lexer.h" | ||
5 | |||
6 | typedef enum ObjectType { | ||
7 | OBJ_TYPE_NIL, | ||
8 | OBJ_TYPE_TRUE, | ||
9 | OBJ_TYPE_FALSE, | ||
10 | OBJ_TYPE_FIXNUM, | ||
11 | OBJ_TYPE_SYMBOL, | ||
12 | OBJ_TYPE_STRING, | ||
13 | OBJ_TYPE_PAIR, | ||
14 | } ObjectType; | ||
15 | |||
16 | typedef struct Object { | ||
17 | ObjectType type; | ||
18 | union { | ||
19 | // OBJ_TYPE_FIXNUM | ||
20 | ssize_t fixnum; | ||
21 | |||
22 | // OBJ_TYPE_STRING | ||
23 | // OBJ_TYPE_SYMBOL | ||
24 | char *text; | ||
25 | |||
26 | // OBJ_TYPE_PAIR | ||
27 | struct { | ||
28 | struct Object *car; | ||
29 | struct Object *cdr; | ||
30 | }; | ||
31 | }; | ||
32 | |||
33 | size_t line; | ||
34 | size_t col; | ||
35 | } Object; | ||
36 | |||
37 | typedef struct Parser { | ||
38 | Token *tokens; | ||
39 | size_t current; | ||
40 | } Parser; | ||
41 | |||
42 | typedef Object* Root; | ||
43 | |||
44 | // Mimics the functionality in the Scanner functions, but for tokens. | ||
45 | Token next_token(Parser *parser); | ||
46 | Token previous_token(Parser *parser); | ||
47 | Token rewind_token(Parser *parser); | ||
48 | Token peek_token(const Parser *parser); | ||
49 | bool has_next_token(const Parser *parser); | ||
50 | |||
51 | // Parsing operations. | ||
52 | Object * parse_tree(Parser *parser, Errors *errors); | ||
53 | Object * parse_symbol(Token tok); | ||
54 | Object * parse_string(Token tok); | ||
55 | Object * parse_bool(Token tok); | ||
56 | Object * parse_fixnum(Token tok); | ||
57 | Object * parse_list(Parser *parser, Errors *errors); | ||
58 | Root * parse(Token *tokens, Errors *errors); | ||
59 | |||
60 | // Object operations. | ||
61 | void object_display(Object *obj); | ||
62 | |||
63 | // Manage resources. | ||
64 | Object * object_alloc(Token tok, ObjectType type); | ||
65 | void object_free(Object *node); | ||
66 | void free_roots(Root *roots); | ||
67 | |||
68 | // | ||
69 | // Helper macros. | ||
70 | // | ||
71 | |||
72 | // Type checking. | ||
73 | #define IS_NIL(VAL) ((VAL)->type == OBJ_TYPE_NIL) | ||
74 | #define IS_TRUE(VAL) ((VAL)->type != OBJ_TYPE_FALSE) | ||
75 | #define IS_FALSE(VAL) ((VAL)->type == OBJ_TYPE_FALSE) | ||
76 | #define IS_FIXNUM(VAL) ((VAL)->type == OBJ_TYPE_FIXNUM) | ||
77 | #define IS_STRING(VAL) ((VAL)->type == OBJ_TYPE_STRING) | ||
78 | #define IS_SYMBOL(VAL) ((VAL)->type == OBJ_TYPE_SYMBOL) | ||
79 | #define IS_PAIR(VAL) ((VAL)->type == OBJ_TYPE_PAIR) | ||
80 | |||
81 | // Debug. | ||
82 | #define OBJ_PRINT(OBJ) object_display(OBJ); printf("\n"); | ||
83 | |||
84 | #endif // BDL_PARSER_H | ||