-- file SMTree.mesa -- last modified by Satterthwaite, August 11, 1983 1:09 pm -- last edit by Schmidt, June 11, 1982 3:01 pm DIRECTORY Rope: TYPE USING [Text], TimeStamp: TYPE USING [Stamp]; Tree: CEDAR DEFINITIONS~{ -- data structures Link: TYPE~REF ANY; null: Link~NIL; Node: TYPE~RECORD[ name: NodeName, attrs: PACKED ARRAY AttrId OF BOOL←ALL[FALSE], visited: BOOL←FALSE, -- flips parity in (non-reentrant) tree walks info: Info, ext: Ext←nullExt, son: SEQUENCE sonLimit: [1..maxNSons] OF Link]; maxNSons: PRIVATE NAT~NAT.LAST; SonId: TYPE~[1..maxNSons); AttrId: TYPE~[1..3]; Info: TYPE~INT←0; -- stream index Ext: TYPE~REF ANY; nullExt: Ext~NIL; Handle: TYPE~REF Node; nullHandle: Handle~NIL; NodeName: TYPE~{ none, lambda, -- LAMBDA decl => exp IN exp 1 = domain decl, 2 = range exp, 3 = exp let, -- LET binding IN exp 1 = binding, 2 = exp arrow, -- decl -> exp 1 = domain decl, 2 = range decl apply, -- exp exp 1 = rator exp, 2 = rand exp applyDefault, -- exp * exp 1 = rator exp, 2 = rand exp subscript, -- exp . id 1 = exp, 2 = id union, -- exp + exp 1, 2 = exp then, -- exp THEN exp 1, 2 = exp exclusion, -- exp - exp 1, 2 = exp restriction, -- exp ↑ exp 1, 2 = exp splitUpper, -- exp \ exp 1, 2 = exp splitLower, -- exp / exp 1, 2 = exp group, -- [ exp's ] 1, ..., n = exp decl, -- [ declElem's ] 1, ..., n = declElem declElem, -- name: exp 1 = id, 2 = exp (or null) bind, -- [ bindElem's ] 1, ..., n = bindElem bindRec, -- REC [ bindElem's ] 1, ..., n = bindElem bindElem, -- decl ~ exp 1 = decl, 2 = exp type, -- TYPE id 1 = name env, -- ENV nil, -- NIL control, -- CONTROL unitId, -- host dirlist namelist ! version 1 = host, 2 = dirlist, -- 3 = namelist, 4 = version uiList, -- namelist 1, ..., name/unquote unQuote, -- name ↑ 1 = name typeTYPE, -- (internal) typeDECL, -- (internal) typeBINDING, -- (internal) typePATTERN, -- (internal) typeSTRING, -- STRING nBind, -- normalized bind (internal) 1 = decl, 2 = group or let nBindRec, -- normalized bindRec (ditto) 1 = decl, 2 = group or let stamp, -- (version stamp, internal) 1 = bcd version stamp cross, -- cross type (internal) 1, 2 = type cross2, -- cross cross type (internal) 1 = decl, 2 = type locator -- transparent (to hold source loc of terminal) }; ApplOp: TYPE~NodeName[$apply..$applyDefault]; BindOp: TYPE~NodeName[$nBind..$nBindRec]; -- terminals Leaf: TYPE~REF ANY; -- union of types below Name: TYPE~ATOM; nullName: Name~NIL; Id: TYPE~REF IdInfo; nullId: Id~NIL; IdInfo: TYPE~RECORD[ db: Tree.Handle←, -- decl or binding p: NAT←, -- position in db mark1, mark2: BOOL←FALSE -- for traversal, etc. ]; -- literals Text: TYPE~Rope.Text; nullText: Text~NIL; Number: TYPE~REF INT; nullNumber: Number~NIL; Stamp: TYPE~REF TimeStamp.Stamp; nullStamp: Stamp~NIL; }.