MODULE Names; IMPORT AGRS,SYSTEM; CONST MaxEntries=64; (* Broj ulaza u hash tabeli *) LastEntry=MaxEntries-1; TYPE CharPtr*= POINTER TO ARRAY OF CHAR; PublicName= POINTER TO RECORD(AGRS.NameDesc) (* Imenovani parametar *) spelling: CharPtr; next: PublicName; END; OrdinalName= POINTER TO RECORD(AGRS.NameDesc) (* Genericki parametar sa imenom 'nth' *) number: INTEGER; next: OrdinalName; END; Dictionary= POINTER TO DictRec; (* Tabela simbola *) DictRec= RECORD entries: ARRAY MaxEntries OF PublicName; next: Dictionary; END; VAR top: Dictionary; ordinalList: OrdinalName; SystemRoot*,VariableRoot*: AGRS.Name; localName*, bodyName*: AGRS.Name; UndefinedTerm: AGRS.SystemTerm; temp: AGRS.Term; temp1: AGRS.SubTerm; temp2: AGRS.SystemTerm; systemSpelling: CharPtr; systemHash: INTEGER; i: INTEGER; search: BOOLEAN; PROCEDURE IsolateSymbols*(query: AGRS.Term): AGRS.Term; VAR d: Dictionary; i: INTEGER; result: AGRS.Term; BEGIN NEW(d); FOR i:= 0 TO LastEntry DO d.entries[i]:=top.entries[i]; END; d.next:= top; top:= d; result:= query.Value(); top:= top.next; RETURN result END IsolateSymbols; PROCEDURE LocalBlock*; VAR d: Dictionary; i: INTEGER; BEGIN NEW(d); FOR i:= 0 TO LastEntry DO d.entries[i]:=top.entries[i]; END; d.next:= top; top:= d; END LocalBlock; PROCEDURE EndBlock*; BEGIN top:= top.next; END EndBlock; PROCEDURE LocalNames; BEGIN search:= FALSE; bodyName.Reduce; END LocalNames; PROCEDURE EndLocalNames; BEGIN search:= TRUE; AGRS.Continue; END EndLocalNames; PROCEDURE NewStringCopy*(str: ARRAY OF CHAR): CharPtr; VAR result: CharPtr; i,length: INTEGER; BEGIN length:= 0; WHILE (length#LEN(str)) & (str[length]#0X) DO INC(length); END; NEW(result,length+1); FOR i:= 0 TO length-1 DO result[i]:= str[i]; END; result[length]:= 0X; AGRS.eldestAsked:= AGRS.Fixed; RETURN result; END NewStringCopy; PROCEDURE HashString(VAR str: ARRAY OF CHAR; module: INTEGER): INTEGER; VAR i,result: INTEGER; BEGIN i:= 0; result:= 0; WHILE (iordinalNumber) THEN NEW(newName); newName.Init(UndefinedTerm); newName.number:= ordinalNumber; newName.next:= seek; follow.next:= newName; RETURN newName ELSE RETURN seek END; END FindOrdinalName; PROCEDURE FindPublicName*(wd: ARRAY OF CHAR): AGRS.Name; VAR follow: PublicName; letter: INTEGER; ordinal: INTEGER; BEGIN IF ~search THEN RETURN NIL END; follow:= top.entries[HashString(wd,MaxEntries)]; WHILE follow#NIL DO IF follow.spelling[0]=wd[0] THEN letter:=1; WHILE (wd[letter]=follow.spelling[letter]) & (follow.spelling[letter]#0X) DO INC(letter); END; IF wd[letter]=follow.spelling[letter] THEN RETURN follow END; END; follow:=follow.next; END; letter:= 0; ordinal:= 0; WHILE (wd[letter]>='0') & (wd[letter]<='9') DO ordinal:= 10*ordinal+ORD(wd[letter])-ORD('0'); INC(letter); END; IF (ordinal=0) OR (wd[letter+2]#0X) THEN RETURN NIL END; CASE wd[letter-1] OF |'1': IF (wd[letter]#'s') OR (wd[letter+1]#'t') THEN RETURN NIL END; |'2': IF (wd[letter]#'n') OR (wd[letter+1]#'d') THEN RETURN NIL END; |'3': IF (wd[letter]#'r') OR (wd[letter+1]#'d') THEN RETURN NIL END; ELSE IF (wd[letter]#'t') OR (wd[letter+1]#'h') THEN RETURN NIL END; END; RETURN FindOrdinalName(ordinal) END FindPublicName; PROCEDURE FindPublicNameNoCase*(wd: ARRAY OF CHAR): AGRS.Name; VAR follow: PublicName; letter: LONGINT; BEGIN letter:= 0; WHILE (wd[letter]#0X) & (letter