aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-23 13:11:10 +0200
committerBad Diode <bd@badd10de.dev>2021-10-23 13:11:10 +0200
commit74f9badefe95c070c0294d90cbf70965d8f68b7a (patch)
tree107f5448352ecc7133d3a062c44b97e638879745 /src
parent928a58ad7977c0e2e445fd9c16db5726cda789e0 (diff)
downloadbdl-74f9badefe95c070c0294d90cbf70965d8f68b7a.tar.gz
bdl-74f9badefe95c070c0294d90cbf70965d8f68b7a.zip
Fix buggy arithmetic list compilation
Diffstat (limited to 'src')
-rwxr-xr-xsrc/bytecode/compiler.h30
1 files changed, 17 insertions, 13 deletions
diff --git a/src/bytecode/compiler.h b/src/bytecode/compiler.h
index 7ec1ca9..201dca6 100755
--- a/src/bytecode/compiler.h
+++ b/src/bytecode/compiler.h
@@ -62,36 +62,29 @@ compile_list_primitive(Chunk *chunk, Visitor *vs, Token op_tok) {
62 Ops op; 62 Ops op;
63 switch (op_tok.type) { 63 switch (op_tok.type) {
64 case TOKEN_ADD: { 64 case TOKEN_ADD: {
65 emit_constant(chunk, op_tok, 0);
66 op = OP_SUM; 65 op = OP_SUM;
67 } break; 66 } break;
68 case TOKEN_SUB: { 67 case TOKEN_SUB: {
69 // TODO: fetch first element.
70 emit_constant(chunk, op_tok, 0);
71 op = OP_SUB; 68 op = OP_SUB;
72 } break; 69 } break;
73 case TOKEN_MUL: { 70 case TOKEN_MUL: {
74 emit_constant(chunk, op_tok, 1);
75 op = OP_MUL; 71 op = OP_MUL;
76 } break; 72 } break;
77 case TOKEN_DIV: { 73 case TOKEN_DIV: {
78 // TODO: fetch first element.
79 emit_constant(chunk, op_tok, 1);
80 op = OP_DIV; 74 op = OP_DIV;
81 } break; 75 } break;
82 case TOKEN_MOD: { 76 case TOKEN_MOD: {
83 // TODO: fetch first element.
84 emit_constant(chunk, op_tok, 1);
85 op = OP_MOD; 77 op = OP_MOD;
86 } break; 78 } break;
87 default: { 79 default: {
88 } break; 80 } break;
89 } 81 }
82 size_t n = 0;
90 while (has_next_token(vs)) { 83 while (has_next_token(vs)) {
91 Token tok = peek_token(vs); 84 Token tok = peek_token(vs);
92 if (tok.type == TOKEN_EOF) { 85 if (tok.type == TOKEN_EOF) {
93 error_push((Error){ 86 error_push((Error){
94 .type = ERR_TYPE_PARSER, 87 .type = ERR_TYPE_COMPILER,
95 .value = ERR_UNBALANCED_PAREN, 88 .value = ERR_UNBALANCED_PAREN,
96 .line = op_tok.line, 89 .line = op_tok.line,
97 .col = op_tok.column, 90 .col = op_tok.column,
@@ -103,7 +96,18 @@ compile_list_primitive(Chunk *chunk, Visitor *vs, Token op_tok) {
103 break; 96 break;
104 } 97 }
105 parse_tree(chunk, vs); 98 parse_tree(chunk, vs);
106 add_code(chunk, op, tok.line, tok.column); 99 n++;
100 if (n > 1) {
101 add_code(chunk, op, tok.line, tok.column);
102 }
103 }
104 if (n == 0) {
105 error_push((Error){
106 .type = ERR_TYPE_COMPILER,
107 .value = ERR_NOT_ENOUGH_ARGS,
108 .line = op_tok.line,
109 .col = op_tok.column,
110 });
107 } 111 }
108} 112}
109 113
@@ -151,7 +155,7 @@ parse_tree(Chunk *chunk, Visitor *vs) {
151 } break; 155 } break;
152 case TOKEN_RPAREN: { 156 case TOKEN_RPAREN: {
153 error_push((Error){ 157 error_push((Error){
154 .type = ERR_TYPE_PARSER, 158 .type = ERR_TYPE_COMPILER,
155 .value = ERR_UNBALANCED_PAREN, 159 .value = ERR_UNBALANCED_PAREN,
156 .line = tok.line, 160 .line = tok.line,
157 .col = tok.column, 161 .col = tok.column,
@@ -175,7 +179,7 @@ parse_tree(Chunk *chunk, Visitor *vs) {
175 // Object *obj = parse_list(vs); 179 // Object *obj = parse_list(vs);
176 // if (obj == obj_err) { 180 // if (obj == obj_err) {
177 // error_push((Error){ 181 // error_push((Error){
178 // .type = ERR_TYPE_PARSER, 182 // .type = ERR_TYPE_COMPILER,
179 // .value = ERR_UNBALANCED_PAREN, 183 // .value = ERR_UNBALANCED_PAREN,
180 // .line = tok.line, 184 // .line = tok.line,
181 // .col = tok.column, 185 // .col = tok.column,
@@ -206,7 +210,7 @@ parse_tree(Chunk *chunk, Visitor *vs) {
206 } break; 210 } break;
207 } 211 }
208 error_push((Error){ 212 error_push((Error){
209 .type = ERR_TYPE_PARSER, 213 .type = ERR_TYPE_COMPILER,
210 .value = ERR_EOF_REACHED, 214 .value = ERR_EOF_REACHED,
211 .line = tok.line, 215 .line = tok.line,
212 .col = tok.column, 216 .col = tok.column,