codea: a-b-c-d sollte jetzt passen... trick: a-b-c-d = a-(b+c+d)
authorBernhard Urban <lewurm@gmail.com>
Mon, 3 May 2010 19:39:51 +0000 (21:39 +0200)
committerBernhard Urban <lewurm@gmail.com>
Mon, 3 May 2010 19:39:51 +0000 (21:39 +0200)
codea/code.bfe
codea/modtest
codea/parser.y
codea/tree.h

index fbef72d590ef092a9137a646fa35c331c880f498..9dcffae83212fccbd4c4e5966d975ad00c8bd108 100644 (file)
@@ -10,7 +10,7 @@
 %}
 
 %start begin
-%term O_RET=1 O_NOT=2 O_SUB=3 O_MUL=4 O_OR=5 O_LESS=6 O_EQ=7 O_ID=8
+%term O_RET=1 O_NOT=2 O_SUB=3 O_MUL=4 O_OR=5 O_LESS=6 O_EQ=7 O_ID=8 O_ADD=9
 
 %%
 
@@ -19,6 +19,7 @@ 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);
+expr: O_ADD(expr,expr) # 1 # printf("\taddq %%%s, %%%s\n", bnode->kids[1]->reg, bnode->kids[0]->reg);
 
 %%
 
index e0ecf639e66bf96cbad0c49f27e29070f8f50489..8fb0018e897883c0da5be9faae4414273d8b1d97 100755 (executable)
@@ -112,6 +112,7 @@ do
            let errnum=errnum+errorfound
                if [ 1 -eq $errorfound ]; then
                        rm *.s
+                       rm *.out
                        exit 3;
                fi
            rm -f a.out $RESFILE $RESFILE.s
index 3703614027712f99d6cb26e9a95f4767bf8fccd2..0622a80543d273d1eb5baf067d872460300de05f 100644 (file)
@@ -29,7 +29,8 @@
 @attributes { struct symbol *f; int parms; } Parms
 @attributes { struct symbol *f; } FeldID Structdef Program
 @attributes { struct symbol *s; } Methoddef Statseq Exprs
-@attributes { struct symbol *s; struct treenode *node; } Lexpr Expr Minusterm Multerm Orterm Term Feld
+@attributes { struct symbol *s; struct treenode *node; } Expr Minusterm
+@attributes { struct symbol *s; struct treenode *node; } Lexpr Multerm Orterm Term Feld
 @attributes { struct symbol *sin; struct symbol *sout; struct treenode *node; } Statement
 
 @traversal @postorder c
@@ -206,6 +207,7 @@ Expr:
 
                @reg {@Term.node@->reg = @Expr.node@->reg;
                        @Minusterm.node@->reg = next_reg(@Term.node@->reg, @Expr.node@->skip);
+                       fprintf(stderr, "2at-expr_: Term.node \"%s\", Minusterm.node \"%s\"\n", @Term.node@->reg, @Minusterm.node@->reg);
                        }
          @}
 
@@ -233,16 +235,19 @@ Expr:
 Minusterm:
          '-' Term Minusterm
          @{
-           @i @Minusterm.node@ = new_node(O_SUB, @Minusterm.1.node@, @Term.node@);
+           @i @Minusterm.node@ = new_node(O_ADD, @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);
+                       fprintf(stderr, "0at-minusterm_: Minusterm.node \"%s\", Minusterm.1.node \"%s\", Term.node \"%s\"\n", @Minusterm.node@->reg, @Minusterm.1.node@->reg, @Term.node@->reg);
                        }
          @}
 
        | '-' Term
          @{
-           @reg @Term.node@->reg = @Minusterm.node@->reg;
+           @reg @Term.node@->reg = @Minusterm.node@->reg; {
+                       fprintf(stderr, "1at-minusterm_: Minusterm.node \"%s\", Term.node \"%s\"\n", @Minusterm.node@->reg, @Term.node@->reg);
+                       }
          @}
        ;
 
index 4c4a0d91a44feb59bbc0c41b32ec09a844af50f7..0d46c38ecccddc96288d61fcb3b7704adfba694a 100644 (file)
@@ -17,7 +17,8 @@ enum {
        O_OR,
        O_LESS,
        O_EQ,
-       O_ID
+       O_ID,
+       O_ADD
 };
 
 static char *o_names[] = {
@@ -29,7 +30,8 @@ static char *o_names[] = {
        "O_OR",
        "O_LESS",
        "O_EQ",
-       "O_ID"
+       "O_ID",
+       "O_ADD"
 };
 
 struct treenode {