diff options
author | Bad Diode <bd@badd10de.dev> | 2021-12-23 12:07:42 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-12-23 12:07:42 +0100 |
commit | 64d282b77633338ac3ff9fe924fe86bfab1012e6 (patch) | |
tree | 9a903531f378fa1c736166c38664f42dfc235256 /src/parser.c | |
parent | 7146084c7730274c7739db5e1ede7e5ee910b237 (diff) | |
download | bdl-64d282b77633338ac3ff9fe924fe86bfab1012e6.tar.gz bdl-64d282b77633338ac3ff9fe924fe86bfab1012e6.zip |
Add `not` and `and` builtins for ir compilation
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/parser.c b/src/parser.c index ce0c395..29a0444 100644 --- a/src/parser.c +++ b/src/parser.c | |||
@@ -5,6 +5,7 @@ static Object **objects = NULL; | |||
5 | static Root *roots = NULL; | 5 | static Root *roots = NULL; |
6 | static Environment **environments = NULL; | 6 | static Environment **environments = NULL; |
7 | 7 | ||
8 | // Builtin procedures. | ||
8 | static Object builtins[] = { | 9 | static Object builtins[] = { |
9 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_ADD, .builtin_text = STRING("+") }, | 10 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_ADD, .builtin_text = STRING("+") }, |
10 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_SUB, .builtin_text = STRING("-") }, | 11 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_SUB, .builtin_text = STRING("-") }, |
@@ -29,6 +30,11 @@ static Object builtins[] = { | |||
29 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_CDR, .builtin_text = STRING("cdr") }, | 30 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_CDR, .builtin_text = STRING("cdr") }, |
30 | }; | 31 | }; |
31 | 32 | ||
33 | // Static singleton objects. | ||
34 | static Object obj_nil = { .type = OBJ_TYPE_NIL }; | ||
35 | static Object obj_true = { .type = OBJ_TYPE_TRUE }; | ||
36 | static Object obj_false = { .type = OBJ_TYPE_FALSE }; | ||
37 | |||
32 | Token | 38 | Token |
33 | peek_token(const Parser *parser) { | 39 | peek_token(const Parser *parser) { |
34 | if (parser->current >= array_size(parser->tokens)) { | 40 | if (parser->current >= array_size(parser->tokens)) { |
@@ -80,9 +86,10 @@ parse_fixnum(Token tok) { | |||
80 | 86 | ||
81 | Object * | 87 | Object * |
82 | parse_bool(Token tok) { | 88 | parse_bool(Token tok) { |
83 | ObjectType type = tok.type == TOKEN_TRUE ? OBJ_TYPE_TRUE : OBJ_TYPE_FALSE; | 89 | if (tok.type == TOKEN_TRUE) { |
84 | Object *ret = object_alloc(tok, type); | 90 | return &obj_true; |
85 | return ret; | 91 | } |
92 | return &obj_false; | ||
86 | } | 93 | } |
87 | 94 | ||
88 | Object * | 95 | Object * |
@@ -444,7 +451,7 @@ parse_tree(Parser *parser, Errors *errors) { | |||
444 | return parse_symbol(tok); | 451 | return parse_symbol(tok); |
445 | } break; | 452 | } break; |
446 | case TOKEN_NIL: { | 453 | case TOKEN_NIL: { |
447 | return object_alloc(tok, OBJ_TYPE_NIL); | 454 | return &obj_nil; |
448 | } break; | 455 | } break; |
449 | default: { | 456 | default: { |
450 | break; | 457 | break; |