6.2声明语句 计算被声明名字的类型和相对地址 P→ offset =0 D;S D→D;D D->id T fenter (id.lexeme,T.type,offset): offset offset T.width T->integer {T.type integer;T.width 4; T->real {T.type real;T.width 8; T-→array num]ofT {T.type array (num.val,T .type); T.width num.val x T.width; T-→个T,{T.ype=pointer(Type);T.width=4;}
6 2. 声 明 语 句 计算被声明名字的类型和相对地址 P {offset = 0} D; S D D ; D D id : T {enter ( id.lexeme, T.type, offset); offset = offset + T.width } T i t n eger {T.type = i t n eger; T.wid ht = 4; } T real {T.type = real; T.width = 8; } T array [ num ] of T1 {T.type = array (num.val, T1 {T.type array (num.val, T .type); 1.type); T.width = num.val T1.width;} T T {T t i t (T t ) T idth 4 } 1 {T.type = pointer (T1.type); T.width = 4; }
6.2声明语句 6.2.2作用域信息的保存 ·所讨论语言的文法 P→D;S D->D;D id:T proc id;D;S ·语义动作用到的函数 mkTable(previous) enter(table,name,type,offset) addWidth(table,width) enterProc(table,name,newtable)
6 2. 声 明 语 句 6.2.2 作用域信息的保存 • 所讨论语言的文法 P D; S D D ; D | id : T | proc id ; D ; S • 语义动作用到的函数 mkTable(previous) enter(table, name, type, offset) addWidth(table, width) enterProc enterProc(table, name, newtable newtable)
6.2声明语句 P->M D;S faddWidth (top (tblStack),top (offsetStack)) pop(tblStack);pop (offsetStack); M→e it mkTable (nil); push(t,tblStack);push (0,offsetStack); D→D;D D->proc id N D S t=top(tblStack); addWidth(t,top(offsetStack)) pop(tblStack);pop(offsetStack); enterProc(top(tblStack),id.lexeme,t); D->id Tfenter(top(tbIStack),id.lexeme,T.type,top(offsetStack)); top(offsetStack)top(offsetStack)T.width; N→ε Kt mkTable(top(tblStack)) push(t,tblStack);push(0,offsetStack);
6 2. 声 明 语 句 P M D; S {addWidth (top (tblStack), top (offsetStack) ); pop(tblStack); pop (offsetStack); } M {t = mkTable mkTable (nil); push(t, tblStack); push (0, offsetStack); } D D1 ; D2 D proc id ; N D1; S {t = top(tblStack); addWidth(t, top(offsetStack) ); p po (tblStack); p po (offsetStack); enterProc(top(tblStack), id.lexeme, t); } Did :T {enter(top(tblStack tblStack), id.lexeme, T.type, top(offsetStack offsetStack)); top(offsetStack) = top(offsetStack) + T.width; } N {t = mkT bl a e(top(tblSt k tblStack) ); push(t, tblStack); push(0, offsetStack); }
6.2声明语句 P->M D;S faddWidth (top (tblStack),top (offsetStack)) pop(tblStack);pop (offsetStack); M→e It mkTable (nil); push(t,tblStack);push (0,offsetStack); D→D1;D2 D>proc id N D St=top(tblStack); addWidth(t,top(offsetStack)) pop(tblStack);pop(offsetStack); enterProc(top(tblStack),id.lexeme,t);} D-id :Tfenter(top(tblStack),id.lexeme,T.type,top(offsetStack)); top(offsetStack)top(offsetStack)T.width; N→ε t=mkTable(top(tblStack)) push(t,tblStack);push(0,offsetStack);
6 2. 声 明 语 句 P M D; S {addWidth (top (tblStack), top (offsetStack) ); pop(tblStack); pop (offsetStack); } M {t = mkTable mkTable (nil); push(t, tblStack); push (0, offsetStack); } D D1 ; D2 D proc id ; N D1; S {t = top(tblStack); addWidth(t, top(offsetStack) ); p po (tblStack); p po (offsetStack); enterProc(top(tblStack), id.lexeme, t); } Did :T {enter(top(tblStack tblStack), id.lexeme, T.type, top(offsetStack offsetStack)); top(offsetStack) = top(offsetStack) + T.width; } N {t = mkT bl a e(top(tblSt k tblStack) ); push(t, tblStack); push(0, offsetStack); }
6.2声明语句 P->M D;S {addWidth (top (tblStack),top (offsetStack)); pop(tblStack);pop (offsetStack); M→e It mkTable (nil); push(t,tblStack);push (0,offsetStack); D→D1;D2 D-→proc id;ND1;S{t=top(tblStack); addWidth(t,top(offsetStack)) pop(tblStack);pop(offsetStack); enterProc(top(tblStack),id.lexeme,t); D->id :Tfenter(top(tblStack),id.lexeme,T.type,top(offsetStack)); top(offsetStack)top(offsetStack)T.width; N→e Kt mkTable(top(tblStack)) push(t,tblStack);push(0,offsetStack);
6 2. 声 明 语 句 P M D; S {addWidth (top (tblStack), top (offsetStack) ); pop(tblStack); pop (offsetStack); } M {t = mkTable mkTable (nil); push(t, tblStack); push (0, offsetStack); } D D1 ; D2 D proc id ; N D1; S {t = top(tblStack); addWidth(t, top(offsetStack) ); p po (tblStack); p po (offsetStack); enterProc(top(tblStack), id.lexeme, t); } Did :T {enter(top(tblStack tblStack), id.lexeme, T.type, top(offsetStack offsetStack)); top(offsetStack) = top(offsetStack) + T.width; } N {t = mkT bl a e(top(tblSt k tblStack) ); push(t, tblStack); push(0, offsetStack); }