From: Bernhard Urban Date: Mon, 3 May 2010 19:39:51 +0000 (+0200) Subject: codea: a-b-c-d sollte jetzt passen... trick: a-b-c-d = a-(b+c+d) X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=uebersetzerbau-ss10.git;a=commitdiff_plain;h=f099a294f64b898e145c535b45de00895c8fbbd7 codea: a-b-c-d sollte jetzt passen... trick: a-b-c-d = a-(b+c+d) --- diff --git a/codea/code.bfe b/codea/code.bfe index fbef72d..9dcffae 100644 --- a/codea/code.bfe +++ b/codea/code.bfe @@ -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); %% diff --git a/codea/modtest b/codea/modtest index e0ecf63..8fb0018 100755 --- a/codea/modtest +++ b/codea/modtest @@ -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 diff --git a/codea/parser.y b/codea/parser.y index 3703614..0622a80 100644 --- a/codea/parser.y +++ b/codea/parser.y @@ -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); + } @} ; diff --git a/codea/tree.h b/codea/tree.h index 4c4a0d9..0d46c38 100644 --- a/codea/tree.h +++ b/codea/tree.h @@ -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 {