-- file Tree.mesa -- last modified by Satterthwaite, February 17, 1983 3:08 pm DIRECTORY Table: TYPE USING [Base, Finger, Selector, Limit, chunkType], Literals: TYPE USING [LitIndex], Symbols: TYPE USING [ISEIndex, Name, nullName]; Tree: DEFINITIONS = { treeType: Table.Selector = Table.chunkType; Base: TYPE = Table.Base; Finger: TYPE = Table.Finger; Limit: CARDINAL = Table.Limit; -- data structures Link: TYPE = RECORD [ SELECT tag: * FROM subtree => [index: Tree.Index], hash => [index: Symbols.Name], symbol => [index: Symbols.ISEIndex], literal => [index: Literals.LitIndex] ENDCASE]; Node: TYPE = MACHINE DEPENDENT RECORD [ free (0: 0..0): BOOL, -- reserved for allocator name (0: 1..8): Tree.NodeName, attr1 (0: 9..9), attr2 (0: 10..10), attr3 (0: 11..11): BOOL, shared (0: 12..12): BOOL, nSons (0: 13..15): [0..maxNSons], info (1): Tree.Info, son (2): ARRAY [1..1) OF Tree.Link]; Info: TYPE = UNSPECIFIED; AttrId: TYPE = [1..3]; maxNSons: NAT = 7; Index: TYPE = Base RELATIVE POINTER[0..Limit) TO Tree.Node; NullIndex: Tree.Index = Tree.Index.FIRST; Null: Tree.Link = [subtree[index: Tree.NullIndex]]; NullId: Tree.Link = [hash[index: Symbols.nullName]]; NodeName: TYPE = { -- general tree constructors list, item, -- declarations decl, typedecl, basicTC, enumeratedTC, recordTC, monitoredTC, variantTC, refTC, pointerTC, listTC, arrayTC, arraydescTC, sequenceTC, procTC, processTC, portTC, signalTC, errorTC, programTC, anyTC, definitionTC, unionTC, relativeTC, subrangeTC, longTC, opaqueTC, zoneTC, linkTC, varTC, implicitTC, frameTC, discrimTC, paintTC, spareTC, unit, diritem, module, body, inline, lambda, block, -- statements assign, extract, if, case, casetest, caseswitch, bind, do, forseq, upthru, downthru, return, result, goto, exit, loop, free, resume, reject, continue, retry, catchmark, restart, stop, lock, wait, notify, broadcast, unlock, null, label, open, enable, catch, dst, lste, lstf, syscall, checked, lst, spareS3, 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, sequence, listcons, substx, ifx, casex, bindx, assignx, extractx, or, and, relE, relN, relL, relGE, relG, relLE, in, notin, plus, minus, times, div, mod, dot, cdot, dollar, create, not, uminus, addr, uparrow, min, max, lengthen, abs, all, size, first, last, pred, succ, arraydesc, length, base, loophole, nil, new, void, clit, llit, cast, check, float, pad, chop, safen, syscallx, narrow, istype, openx, mwconst, cons, atom, typecode, stringinit, textlit, signalinit, procinit, intOO, intOC, intCO, intCC, thread, none, exlist, initlist, ditem, shorten, self, gcrt, proccheck, ord, val, entry, internal, mergecons}; -- tree manipulation Id: TYPE = RECORD [baseP: Tree.Finger, link: Tree.Link]; Scan: TYPE = PROC [t: Tree.Link]; Map: TYPE = PROC [t: Tree.Link] RETURNS [v: Tree.Link]; Test: TYPE = PROC [t: Tree.Link] RETURNS [BOOL]; }.