aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-12-22 18:22:23 +0100
committerBad Diode <bd@badd10de.dev>2021-12-22 18:22:23 +0100
commitff4b4c94ad5e7a70af31e3bcb63f84b9b7cdc626 (patch)
tree8ebe4cac2443d313d5b74963c4ec1ba490dac6e1
parent7ad32a2a907150e3ce71e89f126ca2a530550158 (diff)
downloadbdl-ff4b4c94ad5e7a70af31e3bcb63f84b9b7cdc626.tar.gz
bdl-ff4b4c94ad5e7a70af31e3bcb63f84b9b7cdc626.zip
Integrate builtin text into objects
-rw-r--r--src/parser.c79
-rw-r--r--src/parser.h1
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;
5static Root *roots = NULL; 5static Root *roots = NULL;
6static Environment **environments = NULL; 6static Environment **environments = NULL;
7 7
8static char *builtin_names[] = {
9 "+", "-", "*", "/", "%",
10 "=", "<", ">", "<=", ">=",
11 "not", "and", "or",
12 "nil?", "zero?", "fixnum?", "bool?",
13 "display",
14 "cons", "car", "cdr",
15};
16
17static Object builtins[] = { 8static 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
41Token 32Token
@@ -104,11 +95,9 @@ parse_string(Token tok) {
104Object * 95Object *
105parse_symbol(Token tok) { 96parse_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