diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-30 08:16:08 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-30 08:16:08 +0200 |
commit | 4ebcd99d1fadac72ea58ea46012a86c5319ef7e7 (patch) | |
tree | 548d749c8fd93a3520f56de7b594d85d83fae062 /src/parser.h | |
parent | fbddf5e0c46778c1e403389ba557ef036b7b0fb5 (diff) | |
download | bdl-4ebcd99d1fadac72ea58ea46012a86c5319ef7e7.tar.gz bdl-4ebcd99d1fadac72ea58ea46012a86c5319ef7e7.zip |
Add parsing of lambda expression
Diffstat (limited to 'src/parser.h')
-rwxr-xr-x | src/parser.h | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/parser.h b/src/parser.h index ee5febe..17bd6d6 100755 --- a/src/parser.h +++ b/src/parser.h | |||
@@ -11,6 +11,7 @@ typedef enum ObjectType { | |||
11 | OBJ_TYPE_SYMBOL, | 11 | OBJ_TYPE_SYMBOL, |
12 | OBJ_TYPE_STRING, | 12 | OBJ_TYPE_STRING, |
13 | OBJ_TYPE_PAIR, | 13 | OBJ_TYPE_PAIR, |
14 | OBJ_TYPE_LAMBDA, | ||
14 | } ObjectType; | 15 | } ObjectType; |
15 | 16 | ||
16 | typedef struct Object { | 17 | typedef struct Object { |
@@ -25,9 +26,15 @@ typedef struct Object { | |||
25 | 26 | ||
26 | // OBJ_TYPE_PAIR | 27 | // OBJ_TYPE_PAIR |
27 | struct { | 28 | struct { |
28 | struct Object *car; | 29 | struct Object *head; |
29 | struct Object *cdr; | 30 | struct Object *tail; |
30 | }; | 31 | }; |
32 | |||
33 | // OBJ_TYPE_LAMBDA | ||
34 | struct { | ||
35 | struct Object **params; | ||
36 | struct Object **body; | ||
37 | }; | ||
31 | }; | 38 | }; |
32 | 39 | ||
33 | size_t line; | 40 | size_t line; |
@@ -55,6 +62,7 @@ Object * parse_string(Token tok); | |||
55 | Object * parse_bool(Token tok); | 62 | Object * parse_bool(Token tok); |
56 | Object * parse_fixnum(Token tok); | 63 | Object * parse_fixnum(Token tok); |
57 | Object * parse_list(Parser *parser, Errors *errors); | 64 | Object * parse_list(Parser *parser, Errors *errors); |
65 | Object * parse_lambda(Parser *parser, Errors *errors); | ||
58 | Root * parse(Token *tokens, Errors *errors); | 66 | Root * parse(Token *tokens, Errors *errors); |
59 | 67 | ||
60 | // Object operations. | 68 | // Object operations. |
@@ -63,7 +71,7 @@ void object_display(Object *obj); | |||
63 | // Manage resources. | 71 | // Manage resources. |
64 | Object * object_alloc(Token tok, ObjectType type); | 72 | Object * object_alloc(Token tok, ObjectType type); |
65 | void object_free(Object *node); | 73 | void object_free(Object *node); |
66 | void free_roots(Root *roots); | 74 | void free_objects(void); |
67 | 75 | ||
68 | // | 76 | // |
69 | // Helper macros. | 77 | // Helper macros. |
@@ -77,6 +85,7 @@ void free_roots(Root *roots); | |||
77 | #define IS_STRING(VAL) ((VAL)->type == OBJ_TYPE_STRING) | 85 | #define IS_STRING(VAL) ((VAL)->type == OBJ_TYPE_STRING) |
78 | #define IS_SYMBOL(VAL) ((VAL)->type == OBJ_TYPE_SYMBOL) | 86 | #define IS_SYMBOL(VAL) ((VAL)->type == OBJ_TYPE_SYMBOL) |
79 | #define IS_PAIR(VAL) ((VAL)->type == OBJ_TYPE_PAIR) | 87 | #define IS_PAIR(VAL) ((VAL)->type == OBJ_TYPE_PAIR) |
88 | #define IS_LAMBDA(VAL) ((VAL)->type == OBJ_TYPE_LAMBDA) | ||
80 | 89 | ||
81 | // Debug. | 90 | // Debug. |
82 | #define OBJ_PRINT(OBJ) object_display(OBJ); printf("\n"); | 91 | #define OBJ_PRINT(OBJ) object_display(OBJ); printf("\n"); |