-- PL.Mesa -- last modifed by Schmidt August 22, 1982 2:22 pm DIRECTORY IO: TYPE USING [Handle], PString: TYPE USING [Stream], Rope: TYPE USING [ROPE]; PL: CEDAR DEFINITIONS = { IS, OS, ES: IO.Handle; Z: ZONE; NodeType: TYPE = {ZERO,ID,STR,NUM, HOLE,LST,CAT,GTR,PAPPLY,FCN, ASS, PROG,FAIL,SEQOF,OPT, SEQOFC, DELETE, MAPPLY, UNARY,PLUS,MINUS,GOBBLE,PALT, SEQ, CATL,WILD, PATTERN,ITER,TILDE,EQUAL, ENV, CLOSURE,COMB, UNDEFINED}; Node: TYPE = REF NodeRecord; NodeRecord: TYPE = RECORD[ e: BOOLEAN _ FALSE, -- if TRUE, this node has been eval'ed Var: SELECT Type: NodeType FROM -- base ID => [name: Symbol], STR => [str: Rope.ROPE], NUM => [num: INT ], FAIL, WILD, HOLE,UNDEFINED => NULL, -- inductive COMB => [proc: Symbol, parm: Node], ASS => [lhs: Symbol, rhs: Node], LST => [listhead: Node, listtail: LSTNode], CAT,CATL,EQUAL, GTR, PALT, PAPPLY, MAPPLY, GOBBLE, ITER, PROG, PLUS, MINUS, SEQ => [left,right: Node], FCN => [parms, fcn: Node], SEQOF, SEQOFC, OPT, DELETE => [pat: Node], PATTERN=> [pattern:Node], TILDE => [not: Node], CLOSURE => [exp: Node, env: Environment], ENDCASE ]; LSTNodeRecord: TYPE = LST NodeRecord; LSTNode: TYPE = REF LSTNodeRecord; rID: TYPE = REF ID NodeRecord; rSTR: TYPE = REF STR NodeRecord; rNUM: TYPE = REF NUM NodeRecord; rFAIL: TYPE = REF FAIL NodeRecord; rWILD: TYPE = REF WILD NodeRecord; rHOLE: TYPE = REF HOLE NodeRecord; rUNDEFINED: TYPE = REF UNDEFINED NodeRecord; rCOMB: TYPE = REF COMB NodeRecord; rASS: TYPE = REF ASS NodeRecord; rLST: TYPE = REF LST NodeRecord; rCAT: TYPE = REF CAT NodeRecord; rCATL: TYPE = REF CATL NodeRecord; rEQUAL: TYPE = REF EQUAL NodeRecord; rGTR: TYPE = REF GTR NodeRecord; rPALT: TYPE = REF PALT NodeRecord; rPAPPLY: TYPE = REF PAPPLY NodeRecord; rMAPPLY: TYPE = REF MAPPLY NodeRecord; rGOBBLE: TYPE = REF GOBBLE NodeRecord; rITER: TYPE = REF ITER NodeRecord; rPROG: TYPE = REF PROG NodeRecord; rPLUS: TYPE = REF PLUS NodeRecord; rMINUS: TYPE = REF MINUS NodeRecord; rSEQ: TYPE = REF SEQ NodeRecord; rFCN: TYPE = REF FCN NodeRecord; rSEQOF: TYPE = REF SEQOF NodeRecord; rSEQOFC: TYPE = REF SEQOFC NodeRecord; rOPT: TYPE = REF OPT NodeRecord; rDELETE: TYPE = REF DELETE NodeRecord; rPATTERN: TYPE = REF PATTERN NodeRecord; rTILDE: TYPE = REF TILDE NodeRecord; rCLOSURE: TYPE = REF CLOSURE NodeRecord; Environment: TYPE = REF ERecord; ERecord: TYPE = RECORD[name: Symbol, val: Node, next: Environment]; Symbol: TYPE = REF SymbolRecord; SymbolRecord: TYPE = RECORD[ name: Rope.ROPE _ NIL, son: ARRAY [0..1] OF Symbol _ ALL[NIL], x:SELECT t: * FROM VAL => [v: Node], ZARY => [p: PROC[Node] RETURNS[Node]], UNARY => [p: PROC[Node,Node] RETURNS[Node]], PFUNC => [p: PROC[PString.Stream] RETURNS[Node, PString.Stream]], PFUNC1 => [p: PROC[PString.Stream,Node] RETURNS[Node, PString.Stream]], ENDCASE ]; rVAL: TYPE = REF VAL SymbolRecord; rZARY: TYPE = REF ZARY SymbolRecord; rUNARY: TYPE = REF UNARY SymbolRecord; rPFUNC: TYPE = REF PFUNC SymbolRecord; rPFUNC1: TYPE = REF PFUNC1 SymbolRecord; -- NumLines: CARDINAL = 35; NumPages: CARDINAL = 35; sSize: CARDINAL = 500; cdebug: BOOLEAN = FALSE; -- -- defined in PLSupImpl.Mesa PBug: SIGNAL[est: Rope.ROPE]; SErr: SIGNAL[est: Rope.ROPE]; RErr: SIGNAL[est: Rope.ROPE]; EndDisplay: SIGNAL; Interrupt: SIGNAL; -- -- -- defined in PLParseImpl.mesa ParseSetup: PROC; Dist: PROC[Rope.ROPE] RETURNS[Node]; SetCurrentNode: PROC[Node]; -- -- defined in PLEvalImpl.mesa EQ: PROC[Rope.ROPE, Rope.ROPE] RETURNS [BOOLEAN]; Equal: PROC[Node, Node] RETURNS[BOOLEAN]; SN: PROC[Rope.ROPE] RETURNS[Node]; BlessString: PROC[Node] RETURNS[Rope.ROPE]; BlessLST: PROC[Node] RETURNS[LSTNode]; PtoR: PROC[LONG POINTER] RETURNS[REF]; Eval: PROC[Node,Environment] RETURNS[Node]; MapList: PROC[LSTNode,PROC[Node] RETURNS[Node]] RETURNS[LSTNode]; Map: PROC[LSTNode,PROC[Node]] ; LengthList: PROC[LSTNode] RETURNS[CARDINAL]; NewNail: PROC RETURNS[LSTNode]; -- -- defined in PLSupImpl.mesa SupSetup: PROC; SupReset: PROC; -- defined in PLStoreImpl.mesa Preorder: PROC[Node, PROC[Node]RETURNS[BOOLEAN]]; ParseTree: PROC[Node]; Insert: PROC[Rope.ROPE, SymbolRecord] RETURNS[Symbol]; Lookup: PROC[Rope.ROPE] RETURNS[Symbol]; StoreSetup: PROC; StoreReset: PROC; StoreCleanup: PROC; GetSpecialNodes: PROC RETURNS[rFAIL,rSTR,LSTNode]; }.