2 : D->T id ; {enter(id.lexeme,T.type,offset);offset=offset+T.width;}
3 : T->X C
T->X {t=X.type;w=X.width;} C{T.type=C.type;T.width=C.width;}
5 : E->E + E {E.addr=newtemp();gen(E.addr=E1.addr+E2.addr);}
6 : E->E * E {E.addr=newtemp();gen(E.addr=E1.addr*E2.addr);}
7 : E->- E {E.addr=newtemp();gen(E.addr=uminus E1.addr);}
8 : E->( E ) {E.addr=E1.addr}
9 : E->id {E.addr=lookup(id.lexeme);if E.addr==null then error}
10 : E->digit {E.addr=lookup(digit.lexeme);if E.addr==null then error}
11 : E->L {E.addr=newtemp(); gen(E.addr=L.array[L.offset];}
12 : F->F , E {把 E.addr 添加到 q 的队尾}
13 : F->E {将 q 初始化为只包含 E.addr}
14 : P->D P P->{offset=0}D P
15 : P->S P P->{offset=0}S P P->{S.next=newlabel();}S{label(S.next);} P
16 : P->no
17 : B->B or B
B->{ B1.true=B.true; B1.false = newlabel();}B1 or
{label(B1.false); B2.true=B.true; B2.false = B2.false;} B2
18 : B->B and B
B->{ B1.false=B.false; B1.true = newlabel();}B1 and
{label(B1.true); B2.true=B.true; B2.false = B2.false;}B2
19 : B->not B
B->not { B1.true=B.false; B1.false = B.true ;}B1
20 : B->( B )
B->({ B1.true=B.true; B1.false = B.false ;} B1 )
21 : B->E1 > E2 {gen (if E1.addr > E2.addr goto B.true);gen(goto B.false);}
22 : B->true {gen(goto B.true);}
23 : B->false {gen(goto B.false);}
24 : S->id = E ; {p=lookup(id.lexeme);if p== nil then error;S.CODE=E.code||gen(p’=’E.addr);}
25 : S->L = E ; {gen(L.array[L.offset]=E.addr);}
26 : S->call id ( F ) ;
27 : S->if B { S }
S->if {B.true=newlabel();B.false=newlabel();} B { {label(B.true);S1.next=S.next}S1 }
28 : S->if B { S } else { S }
S->if {B.true=newlabel();B.false=newlabel();}B{ {label(B.true);S1.next=S.next}S1 {gen(goto
S.next);}}
else { {label(B.false);S2.next=S.next}S2 }
29 : S->while B { S1 }
S->while{S.begin=newlabel();label(S.begin);B.true=nealabel();B.false=S.next;}
B {{label(B.true);S1.next=S.begin;} S{gen(goto S.begin);} }
30 : S->S S S->{S1.next=newlabel();}S1 {label(S1.next);S2.next=newlabel();} S2
32 : C->[ digit ] C {C.type=array(num.val,C1.type);C.width=num.val*C1.width;}
33 : C->no {C.type=t;C.width=4;}
评论6
最新资源