-- file CtoSP1.mesa
-- last modified by Satterthwaite, July 29, 1983 9:32 am

DIRECTORY
  CtoSParseTable: TYPE ParseTable USING [ActionEntry, ProdDataRef, State, TableRef, TSymbol],
  IO: TYPE USING [STREAM],
  Rope: TYPE USING [ROPE],
  SMCommentTable: TYPE USING [Index, Text],
  SMOps: TYPE USING [MS];

CtoSP1: CEDAR DEFINITIONS ~ {
  OPEN CtoSParseTable;

  Index: TYPE~SMCommentTable.Index;
  
 -- ref types
 
  ValueStack: TYPE~REF ValueSeq;
  StateStack: TYPE~REF StateSeq;
  LinkStack: TYPE~REF LinkSeq;
  ActionStack: TYPE~REF ActionSeq;
 
 -- record structures
 
  TValue: TYPE ~ INT←0;			-- value of terminal symbol
  NTValue: TYPE ~ REF ANY←NIL;	-- value of nonterminal 

  Value: TYPE~RECORD[    -- type of the value stack
    t: TValue,			-- length of token for terminals
    n: NTValue];			-- lists or Tree.Link for nonterminals

  ValueSeq: TYPE~RECORD[SEQUENCE length: NAT OF Value];

  nullTValue: TValue ~ -1;
  nullNTValue: NTValue ~ NIL;
  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
    

 -- implemented by scanner
  Atom: PROC RETURNS[Token];
  ErrorContext: PROC[message: SMCommentTable.Text, tokenIndex: Index];
  InstallScanTable: PROC[TableRef];
  ResetScanIndex: PROC[Index] RETURNS[success: BOOL];
  ScanInit: PROC[model: SMOps.MS, source: IO.STREAM];
  ScanReset: PROC RETURNS[nTokens, nErrors: CARDINAL];
  Substr: PROC[start, length: Index] RETURNS[Rope.ROPE];

 -- implemented by parser
  InputLoc: PROC RETURNS[Index];
  InstallParseTable: PROC[TableRef];
  Parse: UNSAFE PROC[model: SMOps.MS, source: IO.STREAM, prefix: BOOL←TRUE]
    RETURNS[complete: BOOL, nTokens, nErrors: CARDINAL];

 -- implemented by tree builder
  AssignDescriptors: PROC[
	qd: ActionStack, vd: ValueStack, ld: LinkStack,
	pp: ProdDataRef,
	model: SMOps.MS];
  ProcessQueue: PROC[qI, top: CARDINAL];
  TokenValue: PROC[TSymbol] RETURNS[TValue];

  }.