7.2声明语句 计算被声明名字的类型和相对地址 P→{offset=0}D;S D→D;D D->id T fenter id.lexeme,T.type,offset); offsetoffset 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,Ti.type); T.width num.val x T.width} T-→个T{T.ype=pointer(T1.ype;T,width=4}
7.2 声 明 语 句 计算被声明名字的类型和相对地址 P → {offset = 0} D; S D → D ; D D → id : T {enter ( 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 ] of T1 {T.type = array (num.val, T1 .type); T.width = num.val T1 .width} T→ T1 {T.type = pointer (T1 .type); T.width = 4 }
7.2声明语句 7.2.2作用域信息的保存 sort ·所讨论语言的文法 vara:.…;X.…g readarray P→D;S vari:...; D→D;Dlid:T exchange proc id D;S quicksort var k v:… partition vari,j:...; 图6.14的程序 参数被略去
7.2 声 明 语 句 7.2.2 作用域信息的保存 • 所讨论语言的文法 P → D; S D → D ; D | id : T | proc id ; D ; S sort var a:…; x:…; readarray var i:…; exchange quicksort var k, v:…; partition var i, j:…; 图6.14的程序 参数被略去
7.2声明语句 sort sort 空表头 readarray a exchange X quicksort readarray 指向readarray partition exchange 指向exchange quicksort readarray exchange quicksort 表头 表头 表头 k V 符号表实例 partition partition
7.2 声 明 语 句 exchange readarray x a 空 表 头 sort quicksort 指向readarray partition v k 表 头 readarray quicksort i 表 头 exchange 表 头 指向exchange partition sort readarray exchange quicksort partition 符号表实例
7.2声明语句 符号表的特点 sort -各过程有各自的符号表 vara.…;x.…g 符号表之间有双向链 readarray var i:...; 构造符号表时需要符号表栈 exchange 构造符号表需要活动记录栈 quicksort 语义动作用到的函数 var k,v:...; mkTable(previous) partition enter(table,name,type,offset) vari,j.…, addWidth(table,width) 图6.14的程序 enterProc(table,name,newtable) 参数被略去
7.2 声 明 语 句 • 符号表的特点 –各过程有各自的符号表 –符号表之间有双向链 –构造符号表时需要符号表栈 –构造符号表需要活动记录栈 • 语义动作用到的函数 mkTable(previous) enter(table, name, type, offset) addWidth(table, width) enterProc(table, name, newtable) sort var a:…; x:…; readarray var i:…; exchange quicksort var k, v:…; partition var i, j:…; 图6.14的程序 参数被略去
7.2声明语句 P→MD;S{addWidth(top(tblptr),top(offset)); pop(tblptr);pop (offset)} M→8 {t mkTable (nil); push(t,tblprt);push (0,offset) D→D1;D2 D→proc id;ND;S{t=top(tblptr); addWidth(t,top(offset))pop(tblptr);pop(offset); enterProc(top(tblptr),id.lexeme,t)} D->id:T {enter(top(tblptr),id.lexeme,T.type,top(offset)); top(offset)=top(offset)+T,width N→e {t mkTable(top(tblptr)) push(t,tblptr);push(0,offset)
7.2 声 明 语 句 P → M D; S {addWidth (top (tblptr), top (offset)); pop(tblptr); pop (offset) } M → {t = mkTable (nil); push(t, tblprt); push (0, offset) } D → D1 ; D2 D → proc id ; N D1 ; S {t = top(tblptr); addWidth(t, top(offset) ); pop(tblptr); pop(offset); enterProc(top(tblptr), id.lexeme, t) } D→id :T {enter(top(tblptr), id.lexeme, T.type, top(offset)); top(offset) = top(offset) + T.width } N → {t = mkTable(top(tblptr) ); push(t, tblptr); push(0, offset) }