aboutsummaryrefslogtreecommitdiffstats
path: root/src/parser.h
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-02-12 19:06:09 +0100
committerBad Diode <bd@badd10de.dev>2022-02-12 19:06:09 +0100
commitfa32ad3224b3e362e5f79eee8785334f4bebdbc8 (patch)
tree4c5cb46baa8dc010921d755f157d6e23db9ce5d0 /src/parser.h
parentc4765a539ee01625dd310a02f0be16ec9a64e2e4 (diff)
downloadbdl-fa32ad3224b3e362e5f79eee8785334f4bebdbc8.tar.gz
bdl-fa32ad3224b3e362e5f79eee8785334f4bebdbc8.zip
Add boilerplate for parser
Diffstat (limited to 'src/parser.h')
-rw-r--r--src/parser.h188
1 files changed, 38 insertions, 150 deletions
diff --git a/src/parser.h b/src/parser.h
index 2604be4..3e016d3 100644
--- a/src/parser.h
+++ b/src/parser.h
@@ -3,162 +3,50 @@
3 3
4#include "lexer.h" 4#include "lexer.h"
5 5
6typedef struct Environment {
7 struct Object **locals;
8 struct Object **local_values;
9 struct Object **params;
10 struct Object **captured;
11 struct Environment *parent;
12} Environment;
13
14typedef enum ObjectType {
15 OBJ_TYPE_NIL,
16 OBJ_TYPE_TRUE,
17 OBJ_TYPE_FALSE,
18 OBJ_TYPE_FIXNUM,
19 OBJ_TYPE_SYMBOL,
20 OBJ_TYPE_STRING,
21 OBJ_TYPE_PAIR,
22 OBJ_TYPE_LAMBDA,
23 OBJ_TYPE_IF,
24 OBJ_TYPE_DEF,
25 OBJ_TYPE_SET,
26 OBJ_TYPE_BUILTIN,
27} ObjectType;
28
29typedef enum Builtin {
30 BUILTIN_ADD,
31 BUILTIN_SUB,
32 BUILTIN_MUL,
33 BUILTIN_DIV,
34 BUILTIN_MOD,
35 BUILTIN_EQ,
36 BUILTIN_LT,
37 BUILTIN_GT,
38 BUILTIN_LE,
39 BUILTIN_GE,
40 BUILTIN_NOT,
41 BUILTIN_AND,
42 BUILTIN_OR,
43 BUILTIN_IS_NIL,
44 BUILTIN_IS_ZERO,
45 BUILTIN_IS_FIXNUM,
46 BUILTIN_IS_BOOL,
47 BUILTIN_PRINT,
48 BUILTIN_CONS,
49 BUILTIN_CAR,
50 BUILTIN_CDR,
51} Builtin;
52
53typedef struct Object {
54 ObjectType type;
55 union {
56 // OBJ_TYPE_FIXNUM
57 ssize_t fixnum;
58
59 // OBJ_TYPE_STRING
60 // OBJ_TYPE_SYMBOL
61 StringView text;
62
63 // OBJ_TYPE_PAIR
64 struct {
65 struct Object *head;
66 struct Object *tail;
67 size_t n_elems;
68 };
69
70 // OBJ_TYPE_LAMBDA
71 struct {
72 struct Object **params;
73 struct Object **body;
74 Environment *env;
75 };
76
77 // OBJ_TYPE_IF
78 struct {
79 struct Object *condition;
80 struct Object *expr_true;
81 struct Object *expr_false;
82 };
83
84 // OBJ_TYPE_DEF
85 // OBJ_TYPE_SET
86 struct {
87 struct Object *var_name;
88 struct Object *var_expr;
89 };
90
91 // OBJ_TYPE_BUILTIN
92 struct {
93 Builtin builtin;
94 StringView builtin_text;
95 };
96 };
97
98 bool visited;
99 size_t line;
100 size_t col;
101} Object;
102
103typedef struct Parser { 6typedef struct Parser {
104 Token *tokens; 7 Token *tokens;
105 size_t current; 8 size_t current;
106} Parser; 9} Parser;
107 10
108typedef Object* Root; 11typedef enum NodeType {
109 12 NODE_ERR,
110typedef struct Program { 13 // NODE_FUNCALL,
111 Root *roots; 14 // NODE_U64,
112 Environment *env; 15 // NODE_U32,
113} Program; 16 // NODE_U16,
114 17 // NODE_U8,
115// Token scanner. 18 // NODE_S64,
116Token next_token(Parser *parser); 19 // NODE_S32,
117Token previous_token(Parser *parser); 20 // NODE_S16,
118Token rewind_token(Parser *parser); 21 // NODE_S8,
119Token peek_token(const Parser *parser); 22 NODE_NUMBER,
120bool has_next_token(const Parser *parser); 23 NODE_STRING,
121 24} NodeType;
122// Parsing operations. 25
123Object * parse_tree(Parser *parser, Errors *errors); 26typedef struct Node {
124Object * parse_symbol(Token tok); 27 NodeType type;
125Object * parse_string(Token tok);
126Object * parse_bool(Token tok);
127Object * parse_fixnum(Token tok);
128Object * parse_list(Parser *parser, Errors *errors);
129Object * parse_lambda(Parser *parser, Errors *errors);
130Object * parse_if(Parser *parser, Errors *errors);
131Object * parse_var(Parser *parser, Errors *errors);
132Program parse(Token *tokens, Errors *errors);
133 28
134// Object operations. 29 union {
135void object_display(Object *obj); 30 // Integer numbers.
136bool object_equal(Object *a, Object *b); 31 // u64 as_u64;
137 32 // u32 as_u32;
138// Manage resources. 33 // u16 as_u16;
139Environment * env_alloc(Environment *parent); 34 // u8 as_u8;
140Object * object_alloc(Token tok, ObjectType type); 35 // s64 as_s64;
141void object_free(Object *node); 36 // s32 as_s32;
142void free_objects(void); 37 // s16 as_s16;
143 38 // s8 as_s8;
144// 39 s64 number;
145// Helper macros. 40
146// 41 // String.
147 42 StringView string;
148// Type checking. 43 // struct {
149#define IS_NIL(VAL) ((VAL)->type == OBJ_TYPE_NIL) 44 // u8 *str;
150#define IS_TRUE(VAL) ((VAL)->type != OBJ_TYPE_FALSE) 45 // u64 n;
151#define IS_FALSE(VAL) ((VAL)->type == OBJ_TYPE_FALSE) 46 // } as_str;
152#define IS_BOOL(VAL) \ 47 };
153 (((VAL)->type == OBJ_TYPE_FALSE) || ((VAL)->type == OBJ_TYPE_TRUE)) 48} Node;
154#define IS_FIXNUM(VAL) ((VAL)->type == OBJ_TYPE_FIXNUM)
155#define IS_STRING(VAL) ((VAL)->type == OBJ_TYPE_STRING)
156#define IS_SYMBOL(VAL) ((VAL)->type == OBJ_TYPE_SYMBOL)
157#define IS_PAIR(VAL) ((VAL)->type == OBJ_TYPE_PAIR)
158#define IS_LAMBDA(VAL) ((VAL)->type == OBJ_TYPE_LAMBDA)
159#define IS_BUILTIN(VAL) ((VAL)->type == OBJ_TYPE_BUILTIN)
160 49
161// Debug. 50void parse(Token *tokens);
162#define OBJ_PRINT(OBJ) object_display(OBJ); printf("\n");
163 51
164#endif // BDL_PARSER_H 52#endif // BDL_PARSER_H