diff options
author | Bad Diode <bd@badd10de.dev> | 2021-12-22 18:22:23 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-12-22 18:22:23 +0100 |
commit | ff4b4c94ad5e7a70af31e3bcb63f84b9b7cdc626 (patch) | |
tree | 8ebe4cac2443d313d5b74963c4ec1ba490dac6e1 /src | |
parent | 7ad32a2a907150e3ce71e89f126ca2a530550158 (diff) | |
download | bdl-ff4b4c94ad5e7a70af31e3bcb63f84b9b7cdc626.tar.gz bdl-ff4b4c94ad5e7a70af31e3bcb63f84b9b7cdc626.zip |
Integrate builtin text into objects
Diffstat (limited to 'src')
-rw-r--r-- | src/parser.c | 79 | ||||
-rw-r--r-- | src/parser.h | 1 |
2 files changed, 35 insertions, 45 deletions
diff --git a/src/parser.c b/src/parser.c index 298220a..3051a28 100644 --- a/src/parser.c +++ b/src/parser.c | |||
@@ -5,37 +5,28 @@ 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 | static char *builtin_names[] = { | ||
9 | "+", "-", "*", "/", "%", | ||
10 | "=", "<", ">", "<=", ">=", | ||
11 | "not", "and", "or", | ||
12 | "nil?", "zero?", "fixnum?", "bool?", | ||
13 | "display", | ||
14 | "cons", "car", "cdr", | ||
15 | }; | ||
16 | |||
17 | static Object builtins[] = { | 8 | static Object builtins[] = { |
18 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_ADD } , | 9 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_ADD, .builtin_text = STRING("+") }, |
19 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_SUB } , | 10 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_SUB, .builtin_text = STRING("-") }, |
20 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_MUL } , | 11 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_MUL, .builtin_text = STRING("*") }, |
21 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_DIV } , | 12 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_DIV, .builtin_text = STRING("/") }, |
22 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_MOD } , | 13 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_MOD, .builtin_text = STRING("%") }, |
23 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_EQ } , | 14 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_EQ, .builtin_text = STRING("=") }, |
24 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_LT } , | 15 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_LT, .builtin_text = STRING("<") }, |
25 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_GT } , | 16 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_GT, .builtin_text = STRING(">") }, |
26 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_LE } , | 17 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_LE, .builtin_text = STRING("<=") }, |
27 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_GE } , | 18 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_GE, .builtin_text = STRING(">=") }, |
28 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_NOT } , | 19 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_NOT, .builtin_text = STRING("not") }, |
29 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_AND } , | 20 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_AND, .builtin_text = STRING("and") }, |
30 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_OR } , | 21 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_OR, .builtin_text = STRING("or") }, |
31 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_IS_NIL } , | 22 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_IS_NIL, .builtin_text = STRING("nil?") }, |
32 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_IS_ZERO } , | 23 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_IS_ZERO, .builtin_text = STRING("zero?") }, |
33 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_IS_FIXNUM } , | 24 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_IS_FIXNUM, .builtin_text = STRING("fixnum?") }, |
34 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_IS_BOOL } , | 25 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_IS_BOOL, .builtin_text = STRING("bool?") }, |
35 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_IS_PRINT } , | 26 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_IS_PRINT, .builtin_text = STRING("display") }, |
36 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_IS_CONS } , | 27 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_IS_CONS, .builtin_text = STRING("cons") }, |
37 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_IS_CAR } , | 28 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_IS_CAR, .builtin_text = STRING("car") }, |
38 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_IS_CDR } , | 29 | { .type = OBJ_TYPE_BUILTIN, .builtin = BUILTIN_IS_CDR, .builtin_text = STRING("cdr") }, |
39 | }; | 30 | }; |
40 | 31 | ||
41 | Token | 32 | Token |
@@ -104,11 +95,9 @@ parse_string(Token tok) { | |||
104 | Object * | 95 | Object * |
105 | parse_symbol(Token tok) { | 96 | parse_symbol(Token tok) { |
106 | // Check if symbol is a builtin procedure. | 97 | // Check if symbol is a builtin procedure. |
107 | size_t n_builtins = sizeof(builtin_names) / sizeof(char*); | 98 | size_t n_builtins = sizeof(builtins) / sizeof(Object); |
108 | for (size_t i = 0; i < n_builtins; ++i) { | 99 | for (size_t i = 0; i < n_builtins; ++i) { |
109 | char *str = builtin_names[i]; | 100 | if (sv_equal(&tok.value, &builtins[i].builtin_text)) { |
110 | size_t str_n = strlen(str); | ||
111 | if (sv_equal(&tok.value, &(StringView){str, str_n})) { | ||
112 | return &builtins[i]; | 101 | return &builtins[i]; |
113 | } | 102 | } |
114 | } | 103 | } |
@@ -612,11 +601,11 @@ semantic_analysis(Environment *env, Object *obj, Errors *errors) { | |||
612 | Object *expr = obj->body[i]; | 601 | Object *expr = obj->body[i]; |
613 | if (i != array_size(obj->body) - 1) { | 602 | if (i != array_size(obj->body) - 1) { |
614 | if (IS_FIXNUM(expr) || | 603 | if (IS_FIXNUM(expr) || |
615 | IS_STRING(expr) || | 604 | IS_STRING(expr) || |
616 | IS_SYMBOL(expr) || | 605 | IS_SYMBOL(expr) || |
617 | IS_LAMBDA(expr) || | 606 | IS_LAMBDA(expr) || |
618 | IS_BOOL(expr) || | 607 | IS_BOOL(expr) || |
619 | IS_NIL(expr)) { | 608 | IS_NIL(expr)) { |
620 | continue; | 609 | continue; |
621 | } | 610 | } |
622 | } | 611 | } |
@@ -662,11 +651,11 @@ parse(Token *tokens, Errors *errors) { | |||
662 | Object *root = roots[i]; | 651 | Object *root = roots[i]; |
663 | if (i != array_size(roots) - 1) { | 652 | if (i != array_size(roots) - 1) { |
664 | if (IS_FIXNUM(root) || | 653 | if (IS_FIXNUM(root) || |
665 | IS_STRING(root) || | 654 | IS_STRING(root) || |
666 | IS_SYMBOL(root) || | 655 | IS_SYMBOL(root) || |
667 | IS_LAMBDA(root) || | 656 | IS_LAMBDA(root) || |
668 | IS_BOOL(root) || | 657 | IS_BOOL(root) || |
669 | IS_NIL(root)) { | 658 | IS_NIL(root)) { |
670 | continue; | 659 | continue; |
671 | } | 660 | } |
672 | } | 661 | } |
@@ -832,7 +821,7 @@ object_display(Object *obj) { | |||
832 | printf(" }"); | 821 | printf(" }"); |
833 | } break; | 822 | } break; |
834 | case OBJ_TYPE_BUILTIN: { | 823 | case OBJ_TYPE_BUILTIN: { |
835 | printf("%s", builtin_names[obj->builtin]); | 824 | printf("%.*s", (int)obj->builtin_text.n, obj->builtin_text.start); |
836 | } break; | 825 | } break; |
837 | } | 826 | } |
838 | return; | 827 | return; |
diff --git a/src/parser.h b/src/parser.h index 41f1fc1..c26e265 100644 --- a/src/parser.h +++ b/src/parser.h | |||
@@ -91,6 +91,7 @@ typedef struct Object { | |||
91 | // OBJ_TYPE_BUILTIN | 91 | // OBJ_TYPE_BUILTIN |
92 | struct { | 92 | struct { |
93 | Builtin builtin; | 93 | Builtin builtin; |
94 | StringView builtin_text; | ||
94 | }; | 95 | }; |
95 | }; | 96 | }; |
96 | 97 | ||