aboutsummaryrefslogtreecommitdiffstats
path: root/src/parser.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-12-23 12:07:42 +0100
committerBad Diode <bd@badd10de.dev>2021-12-23 12:07:42 +0100
commit64d282b77633338ac3ff9fe924fe86bfab1012e6 (patch)
tree9a903531f378fa1c736166c38664f42dfc235256 /src/parser.c
parent7146084c7730274c7739db5e1ede7e5ee910b237 (diff)
downloadbdl-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.c15
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;
5static Root *roots = NULL; 5static Root *roots = NULL;
6static Environment **environments = NULL; 6static Environment **environments = NULL;
7 7
8// Builtin procedures.
8static Object builtins[] = { 9static 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.
34static Object obj_nil = { .type = OBJ_TYPE_NIL };
35static Object obj_true = { .type = OBJ_TYPE_TRUE };
36static Object obj_false = { .type = OBJ_TYPE_FALSE };
37
32Token 38Token
33peek_token(const Parser *parser) { 39peek_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
81Object * 87Object *
82parse_bool(Token tok) { 88parse_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
88Object * 95Object *
@@ -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;