doc: paulchen beispiele {code{a,b},gesamt} entpackt (jedes mal entpacken nervt langsa...
[uebersetzerbau-ss10.git] / aus_sammelwut / paulchen / ublu / ss08 / abgabe / codea / .svn / text-base / code.bfe.svn-base
1 %{
2 /* vim: filetype=c
3  */
4 #define CODE
5
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <assert.h>
9
10 #include "tree.h"
11 #include "code_gen.h"
12
13 /* TODO (-a)+b */
14 /* TODO func f(a,a) return a; end; shall do the same as func f(b,a) return a; end; */
15 %}
16
17 %start stat
18 %term OP_Not=1 OP_Negation=2 OP_Addition=3 OP_Multiplication=4 OP_Disjunction=5 OP_Greater=6 OP_Equal=7 OP_ID=8 OP_Number=9 OP_Field=10 OP_Return=11 OP_Zero=12 OP_One=13 OP_Exprs=14 OP_Call=15
19
20 %%
21
22 stat:   ret                                     # 0 #
23
24 ret:    OP_Return(expr)                         # 1 # move(bnode->reg, "rax"); ret(); 
25
26 expr:   OP_ID                                   # 1 # if(bnode->value<0) move(get_param_reg(-bnode->value), bnode->reg);
27 expr:   imm                                     # 1 # printf("\tmovq $%li, %%%s\n", bnode->value, bnode->reg);
28 expr:   call                                    # 0 #
29 expr:   OP_Negation(expr)                       # 1 # printf("\tnegq %%%s\n", bnode->reg);
30 expr:   OP_Addition(expr,expr)                  # 1 # printf("\taddq %%%s, %%%s\n", bnode->kids[0]->reg, bnode->kids[1]->reg);
31 expr:   OP_Addition(imm,expr)                   # 1 # printf("\taddq $%li, %%%s\n", bnode->kids[0]->value, bnode->kids[1]->reg);
32 expr:   OP_Addition(expr,imm)                   # 1 # if(bnode->kids[0]->op=OP_ID) { move(bnode->kids[0]->reg, bnode->reg); printf("\taddq $%li, %%%s\n", bnode->kids[1]->value, bnode->reg); } else { printf("\tadd $%li, %%%s\n", bnode->kids[1]->value, bnode->kids[0]->reg); }
33 expr:   OP_Multiplication(expr,expr)            # 1 # printf("\timulq %%%s, %%%s\n", bnode->kids[0]->reg, bnode->kids[1]->reg);
34 expr:   OP_Multiplication(imm,expr)             # 1 # printf("\timulq $%li, %%%s\n", bnode->kids[0]->value, bnode->kids[1]->reg);
35 expr:   OP_Multiplication(expr,imm)             # 1 # if(bnode->kids[0]->op=OP_ID) { move(bnode->kids[0]->reg, bnode->reg); printf("\timulq $%li, %%%s\n", bnode->kids[1]->value, bnode->reg); } else { printf("\tadd $%li, %%%s\n", bnode->kids[1]->value, bnode->kids[0]->reg); }
36 expr:   OP_Field(expr,OP_ID)                    # 2 # printf("\tmovq %li(%%%s), %%%s\n", 8*bnode->value, bnode->kids[0]->reg, bnode->reg);
37 expr:   OP_Field(imm,OP_ID)                     # 1 # printf("\tmovq %li, %%%s\n", bnode->kids[0]->value+bnode->value*8, bnode->reg);
38 expr:   OP_Addition(expr, OP_Negation(expr))    # 1 # printf("\tsubq %%%s, %%%s\n", bnode->kids[0]->reg, bnode->kids[1]->kids[0]->reg);
39 expr:   OP_Addition(OP_Negation(expr), OP_Negation(expr))       # 1 # printf("\taddq %%%s, %%%s\n\tneg %%%s\n", bnode->kids[0]->kids[0]->reg, bnode->kids[1]->kids[0]->reg, bnode->kids[1]->kids[0]->reg);
40 expr:   OP_Multiplication(OP_Negation(expr), OP_Negation(expr)) # 1 # printf("\timulq %%%s, %%%s\n", bnode->kids[0]->reg, bnode->kids[1]->reg);
41
42 call:   OP_Call(OP_ID,exprs)                    # 0 # /* ignore at the moment */
43
44 exprs:  expr                                    # 0 #
45 exprs:  OP_Exprs(exprs,expr)                    # 0 #
46
47 zero:   OP_Negation(zero)                       # 0 #
48 zero:   OP_Zero                                 # 0 #
49 zero:   OP_Multiplication(zexpr,zero)           # 0 #
50 zero:   OP_Multiplication(zero,zexpr)           # 0 #
51
52 zexpr:  zero                                    # 0 #
53 zexpr:  imm                                     # 0 #
54 zexpr:  OP_Negation(zexpr)                      # 0 #
55 zexpr:  OP_Addition(zexpr,zexpr)                # 0 #
56 zexpr:  OP_Multiplication(zexpr,zexpr)          # 0 #
57 zexpr:  OP_Field(zexpr,OP_ID)                   # 0 #
58 zexpr:  OP_ID                                   # 0 #
59
60 imm:    zero                                    # 0 #
61 imm:    OP_Negation(imm)                        # 0 # bnode->value=-bnode->kids[0]->value;
62 imm:    OP_Addition(imm,imm)                    # 0 # bnode->value=bnode->kids[0]->value+bnode->kids[1]->value;
63 imm:    OP_Multiplication(imm,imm)              # 0 # bnode->value=bnode->kids[0]->value*bnode->kids[1]->value;
64 imm:    OP_Number                               # 0 # 
65 imm:    OP_Zero                                 # 0 # 
66 imm:    OP_One                                  # 0 # 
67
68 %%
69
70