diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/bytecode/compiler.h | 30 |
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, |