11#include "core.h"
22#include "emit.h"
33
4+ Operand stack_alloc (size_t size );
45Expr visit_operand ();
56Operator visit_op_infix ();
67Operator visit_op_prefix ();
@@ -23,7 +24,7 @@ typedef struct {
2324 *
2425 * @see https://en.wikipedia.org/wiki/Shunting_yard_algorithm
2526 */
26- bool shunting_yard (ExprToken expr_stack [], size_t * expr_stack_size ) {
27+ bool shunting_yard (ExprToken out_queue [], size_t * out_queue_size ) {
2728 Operator op_stack [1 << 10 ];
2829 size_t op_stack_size = 0 ;
2930
@@ -49,7 +50,7 @@ bool shunting_yard(ExprToken expr_stack[], size_t* expr_stack_size) {
4950 Expr operand = visit_operand ();
5051 if (!operand .ok ) return false;
5152 expr_token .operand = operand .operand ;
52- expr_stack [(* expr_stack_size )++ ] = expr_token ;
53+ out_queue [(* out_queue_size )++ ] = expr_token ;
5354 infix_postfix_time = true;
5455 }
5556 }
@@ -58,19 +59,20 @@ bool shunting_yard(ExprToken expr_stack[], size_t* expr_stack_size) {
5859 Operator op = expr_token .op ;
5960 while (op_stack_size > 0 && (operator_precedence [op_stack [op_stack_size - 1 ].tag ] <
6061 operator_precedence [op .tag ] ||
61- (operator_associativity [ op .tag ] == ASSOC_LEFT &&
62- operator_precedence [ op_stack [ op_stack_size - 1 ] .tag ] ==
63- operator_precedence [op .tag ]))) {
64- expr_stack [(* expr_stack_size )++ ] = (ExprToken ){
62+ (operator_precedence [ op_stack [ op_stack_size - 1 ] .tag ] ==
63+ operator_precedence [ op .tag ] &&
64+ operator_associativity [op .tag ] == ASSOC_LEFT ))) {
65+ out_queue [(* out_queue_size )++ ] = (ExprToken ){
6566 .is_operator = true,
6667 .op = op_stack [-- op_stack_size ],
6768 };
6869 }
6970 op_stack [op_stack_size ++ ] = op ;
7071 }
7172 }
73+
7274 while (op_stack_size > 0 ) {
73- expr_stack [(* expr_stack_size )++ ] = (ExprToken ){
75+ out_queue [(* out_queue_size )++ ] = (ExprToken ){
7476 .is_operator = true,
7577 .op = op_stack [-- op_stack_size ],
7678 };
@@ -139,13 +141,15 @@ Expr visit_expr() {
139141 asm_push (RDX );
140142
141143 asm_mov (RAX , * o1 );
144+ asm_mov (RDX , immediate (0 ));
142145 asm_idiv (o2 );
143- asm_mov (tmp , RDX );
146+ Operand tmp_stack = stack_alloc (8 );
147+ asm_mov (tmp_stack , RDX );
144148
145149 asm_pop (RDX );
146150 asm_pop (RAX );
147151
148- * o1 = tmp ;
152+ * o1 = tmp_stack ;
149153 break ;
150154 }
151155 case OP_AND : {
@@ -175,7 +179,7 @@ Expr visit_expr() {
175179 case OP_EQ : {
176180 asm_cmp (* o1 , o2 );
177181 asm_mov (tmp , immediate (0 ));
178- asm_setne (tmp );
182+ asm_sete (tmp );
179183 * o1 = tmp ;
180184 break ;
181185 }
@@ -184,11 +188,12 @@ Expr visit_expr() {
184188 break ;
185189 }
186190 case OP_ASSIGN : {
187- if (o1 -> lvalue .size == 0 ) {
191+ if (o1 -> lvalue .mode == 0 ) {
188192 fprintf (stderr , "not an lvalue\n" );
193+ assert (false);
189194 return (Expr ){};
190195 }
191- asm_mov ((Operand ){.tag = REGISTER , .reg = o1 -> lvalue }, o2 );
196+ asm_mov ((Operand ){.tag = MEMORY , .memory = o1 -> lvalue }, o2 );
192197 break ;
193198 }
194199 default : {
@@ -205,16 +210,15 @@ Expr visit_expr() {
205210 case OP_INDEX : {
206211 Operand idx = op .operand ;
207212 {
208- Operand ptr = expr_registers [ expr_registers_busy ++ ] ;
213+ Operand ptr = stack_alloc ( 8 ) ;
209214 asm_mov (ptr , idx );
210215 asm_add (ptr , * o );
211216
212217 Operand res = expr_registers [expr_registers_busy ++ ];
213- ptr . reg . indirect = true ;
218+ res . lvalue = ptr . lvalue ;
214219 asm_mov (res , ptr );
215220
216221 * o = res ;
217- o -> lvalue = ptr .reg ;
218222 }
219223 goto c ;
220224 }
0 commit comments