-- file Tree.Mesa -- last modified by Satterthwaite, October 30, 1979 3:33 PM DIRECTORY Table: FROM "table" USING [Base, Finger, Selector, Limit, chunkType], Literals: FROM "literals" USING [LitRecord], Symbols: FROM "symbols" USING [HTIndex, ISEIndex, HTNull]; Tree: DEFINITIONS = BEGIN treeType: Table.Selector = Table.chunkType; -- data structures Link: TYPE = RECORD [ SELECT tag: * FROM subtree => [index: Tree.Index], hash => [index: Symbols.HTIndex], symbol => [index: Symbols.ISEIndex], literal => [info: Literals.LitRecord], ENDCASE]; Node: TYPE = MACHINE DEPENDENT RECORD [ free: BOOLEAN, -- reserved for allocator name: NodeName, attr3: BOOLEAN, shared: BOOLEAN, attr1, attr2: BOOLEAN, nSons: [0..MaxNSons], info: UNSPECIFIED, son: ARRAY [1..1) OF Tree.Link]; MaxNSons: CARDINAL = 7; Index: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO Tree.Node; NullIndex: Tree.Index = FIRST[Tree.Index]; Null: Tree.Link = [subtree[index: Tree.NullIndex]]; NullId: Tree.Link = [hash[index: Symbols.HTNull]]; NodeName: TYPE = { -- general tree constructors list, item, -- declarations decl, typedecl, basicTC, enumeratedTC, recordTC, monitoredTC, variantTC, pointerTC, arrayTC, arraydescTC, procTC, processTC, portTC, signalTC, errorTC, programTC, definitionTC, unionTC, relativeTC, subrangeTC, longTC, virtualTC, implicitTC, frameTC, discrimTC, entry, internal, unit, diritem, module, body, inline, lambda, block, -- statements assign, extract, if, case, casetest, caseswitch, bind, do, forseq, upthru, downthru, return, result, goto, exit, loop, resume, continue, retry, catchmark, restart, stop, lock, wait, notify, broadcast, unlock, null, label, open, enable, catch, dst, lst, lstf, subst, call, portcall, signal, error, syserror, xerror, start, join, -- expressions apply, callx, portcallx, signalx, errorx, syserrorx, startx, fork, joinx, index, dindex, seqindex, reloc, construct, union, rowcons, substx, ifx, casex, bindx, assignx, or, and, relE, relN, relL, relGE, relG, relLE, in, notin, plus, minus, times, div, mod, dot, cdot, dollar, new, not, uminus, addr, uparrow, min, max, lengthen, abs, all, size, first, last, arraydesc, length, base, loophole, void, clit, llit, cast, check, float, pad, chop, safen, openx, mwconst, typecode, stringinit, signalinit, portinit, procinit, intOO, intOC, intCO, intCC, thread, none, syscall, syscallx, exlist }; -- tree manipulation Id: TYPE = RECORD [baseP: Table.Finger, link: Tree.Link]; Scan: TYPE = PROCEDURE [t: Tree.Link]; Map: TYPE = PROCEDURE [t: Tree.Link] RETURNS [v: Tree.Link]; Test: TYPE = PROCEDURE [t: Tree.Link] RETURNS [BOOLEAN]; END.