<> <> <> <> DIRECTORY IO: TYPE USING [STREAM], MTParseTable: TYPE ParseTable USING [ActionEntry, ProdDataRef, State, TableRef, TSymbol], Rope USING [ROPE]; MTP1: CEDAR DEFINITIONS ~ { OPEN MTParseTable; Index: TYPE~INT; <> ValueStack: TYPE~REF ValueSeq; StateStack: TYPE~REF StateSeq; LinkStack: TYPE~REF LinkSeq; ActionStack: TYPE~REF ActionSeq; <> <> AddrSpecNode: TYPE ~ RECORD[ localPart: REF ANY, -- localPart may point to AddrSpecNode or DotWordsNode atSign: REF TerminalNode _ NIL, domain: REF DomainNode _ NIL]; DomainNode: TYPE ~ RECORD[ domain: REF DomainNode _ NIL, dot: REF TerminalNode _ NIL, subDomain: REF TerminalNode]; DotWordsNode: TYPE ~ RECORD[ dotWords: REF DotWordsNode _ NIL, dot: REF TerminalNode _ NIL, word: REF TerminalNode]; InternalNode: TYPE ~ LIST OF REF ANY; MailboxNode: TYPE ~ RECORD[ phrase: REF ANY _ NIL, address: REF ANY]; RouteAddrNode: TYPE ~ RECORD[ lBrack: REF TerminalNode, route: REF RouteNode _ NIL, colon: REF TerminalNode _ NIL, addrSpec: REF AddrSpecNode, rBrack: REF TerminalNode]; RouteNode: TYPE ~ RECORD[ route: REF RouteNode _ NIL, comma: REF TerminalNode _ NIL, atSign: REF TerminalNode, domain: REF DomainNode]; TerminalNode: TYPE ~ RECORD[ whiteSpace: Rope.ROPE _ NIL, text: Rope.ROPE]; TValue: TYPE ~ REF ANY_NIL; -- value of terminal symbol NTValue: TYPE ~ CARDINAL_0; -- value of nonterminal Value: TYPE~RECORD[ -- type of the value stack t: TValue, -- refs (ATOMS, etc.) n: NTValue]; -- scalars (counts, flags, etc.) ValueSeq: TYPE~RECORD[SEQUENCE length: NAT OF Value]; nullTValue: TValue ~ NIL; nullNTValue: NTValue ~ NTValue.LAST; nullValue: Value ~ []; nullId: Value ~ nullValue; StateSeq: TYPE~RECORD[SEQUENCE length: NAT OF State]; LinkSeq: TYPE~RECORD[SEQUENCE length: NAT OF Index]; -- links to source text ActionSeq: TYPE~RECORD[SEQUENCE length: NAT OF ActionEntry]; Token: TYPE~RECORD[ class: TSymbol, -- the token class value: TValue, -- value index: Index]; -- source stream index <> ScanInit: PROC[source: IO.STREAM]; ScanReset: PROC RETURNS[nTokens, nErrors: CARDINAL]; ScannerProc: TYPE~PROC RETURNS [token: Token]; ScanName: ScannerProc; ScanDate: ScannerProc; <> InstallParseTable: PROC[TableRef]; Parse: PROC[source: IO.STREAM, Input: ScannerProc] RETURNS[complete: BOOL, nTokens, nErrors: CARDINAL]; <> AssignDescriptors: PROC[ qd: ActionStack, vd: ValueStack, ld: LinkStack, pp: ProdDataRef]; EvalInit: PROC; ProcessQueue: PROC[qI, top: CARDINAL]; ProcessError: PROC[top: CARDINAL, inputValue: TValue]; GetEvalResult: PROC RETURNS [tree: REF ANY, badSemantics: BOOL]; }.