%}
%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
%%
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);
%%
@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
@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);
}
@}
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);
+ }
@}
;