123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- implement Tcl_Stack;
- include "sys.m";
- sys : Sys;
- include "draw.m";
- include "tk.m";
- include "tcl.m";
- include "tcllib.m";
- include "utils.m";
- htab: Str_Hashtab;
- shtab: Sym_Hashtab;
- Hash: import htab;
- SHash: import shtab;
- sframe : adt {
- simple : ref Hash;
- assoc : array of (ref Hash,string);
- symtab : ref SHash;
- };
- stack := array[100] of sframe;
- curlevel : int;
- nlev : int;
- init() {
- curlevel=-1;
- nlev=-1;
- htab = load Str_Hashtab Str_Hashtab->PATH;
- shtab = load Sym_Hashtab Sym_Hashtab->PATH;
- sys = load Sys Sys->PATH;
- if (htab == nil){
- sys->print("can't load Hashtab %r\n");
- exit;
- }
- if (shtab == nil){
- sys->print("can't load Sym_Hashtab %r\n");
- exit;
- }
- }
- newframe() : (ref Hash,array of (ref Hash,string),ref SHash) {
- nv := htab->alloc(101);
- av := array[100] of (ref Hash,string);
- st := shtab->alloc(101);
- #sys->print("New frame, curlevel is %d\n",curlevel);
- push (nv,av,st);
- return (nv,av,st);
- }
- level() : int {
- return curlevel;
- }
- move(lev :int) : int {
- if (lev <0 || lev>nlev)
- return 0;
- curlevel=lev;
- return 1;
- }
- push(sv : ref Hash, av : array of (ref Hash,string), st :ref SHash){
- curlevel++;
- nlev++;
- stack[curlevel].simple=sv;
- stack[curlevel].assoc=av;
- stack[curlevel].symtab=st;
- }
- pop() : (ref Hash,array of (ref Hash,string),ref SHash) {
- s:=stack[curlevel].simple;
- a:=stack[curlevel].assoc;
- t:=stack[curlevel].symtab;
- stack[curlevel].simple=nil;
- stack[curlevel].assoc=nil;
- stack[curlevel].symtab=nil;
- curlevel--;
- nlev--;
- return (s,a,t);
- }
- examine(lev : int) : (ref Hash,array of (ref Hash,string),ref SHash) {
- if (lev <0 || lev > nlev)
- return (nil,nil,nil);
- return (stack[lev].simple,stack[lev].assoc,stack[lev].symtab);
- }
- dump() {
- for (i:=0;i<100;i++){
- if (stack[i].simple!=nil){
- sys->print("simple table at %d\n",i);
- for (j:=0;j<101;j++)
- if (stack[i].simple.tab[j]!=nil){
- sys->print("\tH_link at %d\n",j);
- l:=stack[i].simple.tab[j];
- while(l!=nil){
- sys->print("\tname [%s], value [%s]\n",
- (hd l).name,(hd l).val);
- l=tl l;
- }
- }
- }
- if (stack[i].assoc!=nil){
- sys->print("assoc table at %d\n",i);
- for(j:=0;j<100;j++){
- (rh,s):=stack[i].assoc[j];
- if (rh!=nil){
- sys->print(
- "\tassoc array at %d, name %s\n",
- j,s);
- for (k:=0;k<101;k++)
- if (rh.tab[k]!=nil){
- sys->print(
- "\t\tH_link at %d\n",k);
- l:=rh.tab[k];
- while(l!=nil){
- sys->print(
- "\t\tname [%s], value [%s]\n",
- (hd l).name,(hd l).val);
- l=tl l;
- }
- }
- }
- }
- }
- if (stack[i].symtab!=nil){
- sys->print("Symbol table at %d\n",i);
- for (j:=0;j<101;j++)
- if (stack[i].symtab.tab[j]!=nil){
- sys->print("\tH_link at %d\n",j);
- l:=stack[i].symtab.tab[j];
- while(l!=nil){
- sys->print("\tname [%s], alias [%s], "+
- "value [%d]\n",(hd l).name,
- (hd l).alias,(hd l).val);
- l=tl l;
- }
- }
- }
- }
- }
|