DIRECTORY TreesDefs USING [NodeType, TreeNode], Storage USING [Free, FreeString, Node]; TreesImpl: PROGRAM IMPORTS Storage EXPORTS TreesDefs = { MakeNode: PUBLIC PROCEDURE [left, right: LONG POINTER TO TreesDefs.TreeNode, string: LONG STRING, nodeType: TreesDefs.NodeType] RETURNS [newNode: LONG POINTER TO TreesDefs.TreeNode] = { newNode ← Storage.Node[nwords: SIZE[TreesDefs.TreeNode]]; newNode.left ← left; newNode.right ← right; newNode.lastInList ← NIL; newNode.string ← string; newNode.nodeType ← nodeType; newNode.char ← FALSE; newNode.short ← FALSE; newNode.int ← FALSE; newNode.long ← FALSE; newNode.unsigned ← FALSE; newNode.float ← FALSE; newNode.double ← FALSE; newNode.structure ← FALSE; newNode.union ← FALSE; newNode.enumeration ← FALSE; newNode.class ← noClass; newNode.declaratorType ← unknown; newNode.operationType ← unknown; newNode.dataType ← none; newNode.typeString ← NIL; newNode.baseDataType ← none; newNode.pointerCount ← 0; }; FreeTree: PUBLIC PROCEDURE [node: LONG POINTER TO TreesDefs.TreeNode] = { IF node = NIL THEN RETURN; FreeTree[node.left]; FreeTree[node.right]; IF node.string # NIL THEN Storage.FreeString[node.string]; Storage.Free[node]; }; }.