aboutsummaryrefslogtreecommitdiffstats
path: root/src/parser.h
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-29 19:11:40 +0200
committerBad Diode <bd@badd10de.dev>2021-10-29 19:11:40 +0200
commit5ed73b695e6b463149ab0c9ae3eccb26a4ec5807 (patch)
tree01aa089934d1b49fe515fe86fffca01c471c69e9 /src/parser.h
parente73a4c16a2269cdb2f5e7d66fb9839e4c44e14de (diff)
downloadbdl-5ed73b695e6b463149ab0c9ae3eccb26a4ec5807.tar.gz
bdl-5ed73b695e6b463149ab0c9ae3eccb26a4ec5807.zip
Add parser for tokens->ast conversion
Diffstat (limited to 'src/parser.h')
-rwxr-xr-xsrc/parser.h84
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
6typedef 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
16typedef 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
37typedef struct Parser {
38 Token *tokens;
39 size_t current;
40} Parser;
41
42typedef Object* Root;
43
44// Mimics the functionality in the Scanner functions, but for tokens.
45Token next_token(Parser *parser);
46Token previous_token(Parser *parser);
47Token rewind_token(Parser *parser);
48Token peek_token(const Parser *parser);
49bool has_next_token(const Parser *parser);
50
51// Parsing operations.
52Object * parse_tree(Parser *parser, Errors *errors);
53Object * parse_symbol(Token tok);
54Object * parse_string(Token tok);
55Object * parse_bool(Token tok);
56Object * parse_fixnum(Token tok);
57Object * parse_list(Parser *parser, Errors *errors);
58Root * parse(Token *tokens, Errors *errors);
59
60// Object operations.
61void object_display(Object *obj);
62
63// Manage resources.
64Object * object_alloc(Token tok, ObjectType type);
65void object_free(Object *node);
66void 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