1implement Tcl_Stack; 2 3include "sys.m"; 4 sys : Sys; 5include "draw.m"; 6include "tk.m"; 7include "tcl.m"; 8include "tcllib.m"; 9include "utils.m"; 10 htab: Str_Hashtab; 11 shtab: Sym_Hashtab; 12Hash: import htab; 13SHash: import shtab; 14 15sframe : adt { 16 simple : ref Hash; 17 assoc : array of (ref Hash,string); 18 symtab : ref SHash; 19}; 20 21stack := array[100] of sframe; 22curlevel : int; 23nlev : int; 24 25init() { 26 curlevel=-1; 27 nlev=-1; 28 htab = load Str_Hashtab Str_Hashtab->PATH; 29 shtab = load Sym_Hashtab Sym_Hashtab->PATH; 30 sys = load Sys Sys->PATH; 31 if (htab == nil){ 32 sys->print("can't load Hashtab %r\n"); 33 exit; 34 } 35 if (shtab == nil){ 36 sys->print("can't load Sym_Hashtab %r\n"); 37 exit; 38 } 39} 40 41newframe() : (ref Hash,array of (ref Hash,string),ref SHash) { 42 nv := htab->alloc(101); 43 av := array[100] of (ref Hash,string); 44 st := shtab->alloc(101); 45 #sys->print("New frame, curlevel is %d\n",curlevel); 46 push (nv,av,st); 47 return (nv,av,st); 48} 49 50level() : int { 51 return curlevel; 52} 53 54move(lev :int) : int { 55 if (lev <0 || lev>nlev) 56 return 0; 57 curlevel=lev; 58 return 1; 59} 60 61push(sv : ref Hash, av : array of (ref Hash,string), st :ref SHash){ 62 curlevel++; 63 nlev++; 64 stack[curlevel].simple=sv; 65 stack[curlevel].assoc=av; 66 stack[curlevel].symtab=st; 67} 68 69pop() : (ref Hash,array of (ref Hash,string),ref SHash) { 70 s:=stack[curlevel].simple; 71 a:=stack[curlevel].assoc; 72 t:=stack[curlevel].symtab; 73 stack[curlevel].simple=nil; 74 stack[curlevel].assoc=nil; 75 stack[curlevel].symtab=nil; 76 curlevel--; 77 nlev--; 78 return (s,a,t); 79} 80 81examine(lev : int) : (ref Hash,array of (ref Hash,string),ref SHash) { 82 if (lev <0 || lev > nlev) 83 return (nil,nil,nil); 84 return (stack[lev].simple,stack[lev].assoc,stack[lev].symtab); 85} 86 87dump() { 88 for (i:=0;i<100;i++){ 89 if (stack[i].simple!=nil){ 90 sys->print("simple table at %d\n",i); 91 for (j:=0;j<101;j++) 92 if (stack[i].simple.tab[j]!=nil){ 93 sys->print("\tH_link at %d\n",j); 94 l:=stack[i].simple.tab[j]; 95 while(l!=nil){ 96 sys->print("\tname [%s], value [%s]\n", 97 (hd l).name,(hd l).val); 98 l=tl l; 99 } 100 } 101 } 102 if (stack[i].assoc!=nil){ 103 sys->print("assoc table at %d\n",i); 104 for(j:=0;j<100;j++){ 105 (rh,s):=stack[i].assoc[j]; 106 if (rh!=nil){ 107 sys->print( 108 "\tassoc array at %d, name %s\n", 109 j,s); 110 for (k:=0;k<101;k++) 111 if (rh.tab[k]!=nil){ 112 sys->print( 113 "\t\tH_link at %d\n",k); 114 l:=rh.tab[k]; 115 while(l!=nil){ 116 sys->print( 117 "\t\tname [%s], value [%s]\n", 118 (hd l).name,(hd l).val); 119 l=tl l; 120 } 121 } 122 123 } 124 } 125 } 126 if (stack[i].symtab!=nil){ 127 sys->print("Symbol table at %d\n",i); 128 for (j:=0;j<101;j++) 129 if (stack[i].symtab.tab[j]!=nil){ 130 sys->print("\tH_link at %d\n",j); 131 l:=stack[i].symtab.tab[j]; 132 while(l!=nil){ 133 sys->print("\tname [%s], alias [%s], "+ 134 "value [%d]\n",(hd l).name, 135 (hd l).alias,(hd l).val); 136 l=tl l; 137 } 138 } 139 } 140 } 141} 142 143