-- file BcdTree.Mesa -- last modified by Satterthwaite, September 14, 1982 3:17 pm DIRECTORY BcdDefs: TYPE USING [treetype], Symbols: TYPE USING [HTIndex, HTNull, STIndex], Table: TYPE USING [Base, Finger, Limit, Selector]; Tree, Literals: DEFINITIONS = { treeType: Table.Selector ~ BcdDefs.treetype; 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.HTIndex], symbol => [index: Symbols.STIndex], literal => [info: Literals.LitRecord] ENDCASE]; Node: TYPE ~ MACHINE DEPENDENT RECORD [ free (0: 0..0): BOOL, -- reserved for allocator name (0: 1..4): NodeName, attr1 (0: 5..5), attr2 (0: 6..6), attr3 (0: 7..7): BOOL, shared (0: 8..8): BOOL, nSons (0: 9..15): [0..MaxNSons], info (1): UNSPECIFIED, son (2): ARRAY [1..1) OF Tree.Link]; AttrId: TYPE ~ [1..3]; MaxNSons: CARDINAL ~ 177b; 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.HTNull]]; NodeName: TYPE ~ { -- general tree constructors list, item, -- declarations source, config, -- expressions module, assign, plus, then, -- file names dot, slash, -- nil none }; -- tree manipulation Id: TYPE ~ RECORD [baseP: 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]; -- literals LTIndex, STIndex: TYPE ~ Symbols.HTIndex; LitRecord: TYPE ~ RECORD [ SELECT litTag: * FROM word => [index: LTIndex], string => [index: STIndex] ENDCASE]; }.