diff options
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; |