72声明语句 计算被声明名字的类型和相对地址 P→{ offset=0}D;S D→D:D D-id: T enter(id lexeme, T type, offset offset = offset Iwidth j T>integer (T type= integer, Twidth=4) T> real type= real; Twidth=8) T→> array i num of T1 iT type=array(num. val, Ttype); T width=num.val x T, width) T→↑T1{Tpe= pointer(T10p0;r:imh=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 }
72声明语句 72,2作用域信息的保存 sort 所讨论语言的文法 var a...X. readarray P→D;S var ··· D→D;D|id:Tl exchange proc id D: S quicksort var k, v partition var 图614的程序 参数被略去
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的程序 参数被略去
72声明语句 sort sort 空表头 readarray a exchange quicksort readarray指向 Jreadarray partition exchange 指向 exchange quicksort readarray exchange quicksort 表头 表头 表头 符号表实例 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 符号表实例
72声明语句 符号表的特点 sort 各过程有各自的符号表 var a...X. 符号表之间有双向链 readarray var 构造符号表时需要符号表栈 ··· exchange 构造符号表需要活动记录栈 quicksort 语义动作用到的函数 var k, v muTable(previous) partition enter(table, name, type, offset var addwidth(table, width) 图614的程序 enter proc( 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的程序 参数被略去
72声明语句 P→MD;S{ iddwidth(top( lptr),t0p(0的fe): pop(tblptr); pop(offset)) M→8{t= muTable(ni); push(t, tblprt); push(0, offset)) D→D1;D D- proc id ND;Sit=top(tblptr); addwidth(t, top(offset)); pop(tblptr); pop(offset) enterProc(top(tblptr), id lexeme, t)) D-id Tenter( top(tblptr), id lexeme, T type, toploffset) top(offset= top(offset)+ Twidth j N>8 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) }