
    <<CtoSP1.Mesa>>
        <<Copyright  1985 by Xerox Corporation.  All rights reserved.>>
        <<Satterthwaite, April 15, 1986 12:18:27 pm PST>>
    <<>>
    DIRECTORY
        IO: TYPE USING [STREAM],
        CtoSParseTable: TYPE ParseTable USING [ActionEntry, ProdDataRef, State, TableRef, TSymbol],
        Rope: TYPE USING [ROPE],
        SMCommentTable: TYPE USING [Index],
        SMOps: TYPE USING [MS];

    P1: CEDAR DEFINITIONS ~ {
        OPEN ParseTable ~~ 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 (LONG or REF does not occur past this point)>>

        TValue: TYPE ~ NAT;        -- length of substring

        Value: TYPE ~ RECORD[    -- type of the value stack
            n: REF ANY_NIL,
            t: TValue_0];        -- scalars only (length of token for terminals)

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

        nullTValue: TValue ~ 0;
        nullValue: P1.Value ~ [];
        nullId: P1.Value ~ nullValue;

        StateSeq: TYPE ~ RECORD[SEQUENCE length: NAT OF ParseTable.State];
        LinkSeq: TYPE ~ RECORD[SEQUENCE length: NAT OF CARDINAL];   -- links to source text
        ActionSeq: TYPE ~ RECORD[SEQUENCE length: NAT OF ParseTable.ActionEntry];


        Token: TYPE ~ RECORD [
            class: ParseTable.TSymbol,    -- the token class
            value: TValue,
            index: CARDINAL];        -- source line index

    <<implemented by Scanner>>
        ErrorContext: PROC[message: Rope.ROPE, tokenIndex: Index];
        InstallScanTable: PROC[ParseTable.TableRef];
        NextToken: PROC RETURNS[Token];
        ResetScanIndex: PROC[Index] RETURNS[success: BOOL];
        ScanInit: PROC[model: SMOps.MS, source: IO.STREAM];
        ScanReset: PROC RETURNS[nTokens, nErrors: CARDINAL];
        Substr: PROC[start: Index, length: INT] RETURNS[Rope.ROPE];

    <<implemented by Parser>>
        InputLoc: PROC RETURNS[Index];
        InstallParseTable: PROC[ParseTable.TableRef];
        Parse: UNSAFE PROC[model: SMOps.MS, source: IO.STREAM, prefixOk: BOOL_FALSE]
            RETURNS[complete: BOOL, nTokens, nErrors: CARDINAL];

    <<implemented by tree builder>>

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

        }.

