codea: verschachtelte subtraktionen funktionieren (ohne konstanten)
authorBernhard Urban <lewurm@gmail.com>
Mon, 3 May 2010 14:18:20 +0000 (16:18 +0200)
committerBernhard Urban <lewurm@gmail.com>
Mon, 3 May 2010 14:18:20 +0000 (16:18 +0200)
codea/code.bfe
codea/parser.y
codea/symtable.c

index be6122119d85e535c428273d2e62bf526b7ebbd8..fbef72d590ef092a9137a646fa35c331c880f498 100644 (file)
@@ -18,6 +18,7 @@ begin: ret # 0 # printf("// end\n");
 ret: O_RET(expr) # 1 # move(bnode->reg, "rax"); ret();
 
 expr: O_ID # 1 # if(bnode->param_index > -1) move(param_reg(bnode->param_index), bnode->reg);
+expr: O_SUB(expr,expr) # 1 # printf("\tsubq %%%s, %%%s\n", bnode->kids[0]->reg, bnode->kids[1]->reg);
 
 %%
 
index c6158c2d70e465a6c2a61c96ca5663241c418821..3703614027712f99d6cb26e9a95f4767bf8fccd2 100644 (file)
@@ -202,7 +202,11 @@ Expr:
 
        | Term Minusterm
          @{
-           @i @Expr.node@ = TREENULL; fprintf(stderr, "w00t3\n");
+           @i @Expr.node@ = new_node(O_SUB, @Minusterm.node@, @Term.node@);
+
+               @reg {@Term.node@->reg = @Expr.node@->reg;
+                       @Minusterm.node@->reg = next_reg(@Term.node@->reg, @Expr.node@->skip);
+                       }
          @}
 
        | Term Multerm
@@ -229,14 +233,16 @@ Expr:
 Minusterm:
          '-' Term Minusterm
          @{
-           @i @Minusterm.node@ = TREENULL;
-           @reg fprintf(stderr, "minus1\n");
+           @i @Minusterm.node@ = new_node(O_SUB, @Minusterm.1.node@, @Term.node@);
+
+           @reg { @Minusterm.1.node@->reg = @Minusterm.node@->reg;
+                       @Term.node@->reg = next_reg(@Minusterm.1.node@->reg, @Minusterm.node@->skip);
+                       }
          @}
 
        | '-' Term
          @{
-           @i @Minusterm.node@ = TREENULL;
-           @reg fprintf(stderr, "minus2\n");
+           @reg @Term.node@->reg = @Minusterm.node@->reg;
          @}
        ;
 
@@ -271,7 +277,7 @@ Orterm:
 Term:
          '(' Expr ')'
          @{
-           @i @Term.node@ = TREENULL;
+           @i @Term.node@ = @Expr.node@;
            @reg fprintf(stderr, "wtf1\n");
          @}
 
index 006b6dd3a9b9c0957540da9a8193d96643f8fbbf..5476ae8243fb71637f0ae3f6e73b70cafecdcc1f 100755 (executable)
@@ -3,7 +3,7 @@
 #include <stdio.h>
 #include "symtable.h"
 
-#if 1
+#if 0
 #define DD
 #endif