-- file DIPack.Mesa rewritten by PGS, 25-Oct-80 21:06
-- file DIPack.Mesa modified by
--                  Sandman, January 16, 1979  3:59 PM
--                  Barbara, September 26, 1978  10:34 AM
--                  Bruce, October 25, 1980  7:50 PM

DIRECTORY
  ComData USING [idANY, idBOOL, idCARDINAL, idCHAR, idINT, idREAL, idSTRING],
  DebugOps USING [ParseError],
  DIActions USING [
    exp, memoryInt, arrayInt, conditionalBreak, eol, frameDollar, fileDollar, typeDollar,
    card, lcard, int, lint, bang, memory, reps],
  P1 USING [],
  ParseTable USING [ActionEntry, ProductionInfo],
  Tree USING [NodeName, Null],
  TreeOps USING [PushHash, PushList, PushLit, PushNode, PushSe, PushStringLit, PushTree];
  
Pass1T: PROGRAM
  IMPORTS dataPtr: ComData, DebugOps, TreeOps
  EXPORTS P1 =
  BEGIN OPEN DIActions, P1, TreeOps;
  
  
  q: DESCRIPTOR FOR ARRAY OF ParseTable.ActionEntry;
  v: DESCRIPTOR FOR ARRAY OF UNSPECIFIED;
  l: DESCRIPTOR FOR ARRAY OF CARDINAL;
  proddata: DESCRIPTOR FOR ARRAY OF ParseTable.ProductionInfo;
  
  AssignDescriptors: PUBLIC PROCEDURE [
      lq: DESCRIPTOR FOR ARRAY OF ParseTable.ActionEntry,
      lv: DESCRIPTOR FOR ARRAY OF UNSPECIFIED,
      ll: DESCRIPTOR FOR ARRAY OF CARDINAL,
      lproddata: DESCRIPTOR FOR ARRAY OF ParseTable.ProductionInfo] =
    BEGIN q ← lq; v ← lv; l ← ll; proddata ← lproddata END;
    
  ProcessQueue: PUBLIC PROCEDURE [qI, top: CARDINAL] =
    BEGIN
    rule: [0..256);
    i: CARDINAL;
    vTop: UNSPECIFIED;
    FOR i IN [0..qI) DO
      top ← top-q[i].tag.pLength+1;  vTop ← v[top];
      rule ← proddata[q[i].transition].rule;
      SELECT rule FROM
      
      0  => --BINARY: DIGrammar.bcd  INTERFACE: Init  MODULE: ParseTable.mesa
	--GOAL:  goal
	
	--TERMINALS:
	--    id  num  lnum  card lcard string  char
	--    ,   ;   ←   +   -   *   /   ↑   .   @    $   %
	--    =   #   <  >   <=   >=      
	--    INTEGER  CARDINAL  CHARACTER  BOOLEAN  REAL
	--    POINTER  DESCRIPTOR  LONG  TO  BASE
	--    ABS  MAX  MIN  MOD  LENGTH
	--    LOOPHOLE  SIZE  FIRST  LAST
	--    )   ]   (   [
	--    STRING  UNSPECIFIED  MEMORY  !   \   ..   '?
	--    WORD  PROCEDURE  PROC  ERROR  SIGNAL
	--    NIL
	
	--ALIASES:
	--  id       tokenID
	--  num      tokenNUM
	--  lnum     tokenLNUM
	--  card     tokenCARD
	--  lcard    tokenLCARD
	--  string   tokenSTR
	--  char     tokenCHAR
	--  -        tokenMINUS
	--  .        tokenDOT
	--  ..       tokenDOTS
	--  =        tokenEQUAL
	--  <        tokenLESS
	--  <=       tokenLE
	--  >        tokenGREATER
	--  >=       tokenGE
	--  eof      endmarker
	
	--  PRODUCTIONS:
	
	--  goal					::= stmtlist \
	PushNode[eol,1];  -- all finished
	
      1  => -- stmtlist				::= statementlist 
	    -- stmtlist					::= statementlist ;
	  BEGIN
	  PushList[v[top]];  PushNode[block,1];
	  END;
	  
      2  => -- statementlist				::= statementlist ; statement
	BEGIN
	-- clear the way for the next statement 
	vTop ← v[top]+1; PushNode[eol,1];
	END;
	
      3  => -- statement				::= lhs ← exp
	  PushNode[assign,2];
	  
      4  => -- statement				::= exp
	  PushNode[exp,1];
	  
      5  => -- statement				::= exp '?
	  PushNode[reps,1];
	  
      6  => -- statement				::= MEMORY interval
	  PushNode[memoryInt,1];
	  
      7  => -- statement				::= lhs interval
	  PushNode[arrayInt,2];
	  
      8  => -- statement				::= relation
	  PushNode[conditionalBreak,1];
	  
      9  => -- typeexp					::= id
	  PushHash[v[top]];
	  
      10  => -- typeid					::= INTEGER
	  PushSe[dataPtr.idINT];
      11  => -- typeid					::= CARDINAL
	  PushSe[dataPtr.idCARDINAL];
      12  => -- typeid					::= CHARACTER
	  PushSe[dataPtr.idCHAR];
      13  => -- typeid					::= BOOLEAN
	  PushSe[dataPtr.idBOOL];
      14  => -- typeid					::= REAL
	  PushSe[dataPtr.idREAL];
      15  => -- typeid					::= STRING
	  PushSe[dataPtr.idSTRING];
      16  => -- typeid					::= UNSPECIFIED
	  PushSe[dataPtr.idANY];
      17  => -- typeid					::= WORD
	  PushSe[dataPtr.idANY];
	  
      18  => -- typeid					::= PROCEDURE
	    -- typeid					::= PROC
	  BEGIN
	  PushTree[Tree.Null]; PushNode[procTC,1];
	  END;
      19  => -- typeid					::= ERROR
	  BEGIN
	  PushTree[Tree.Null]; PushNode[errorTC,1];
	  END;
      20  => -- typeid					::= SIGNAL
	  BEGIN
	  PushTree[Tree.Null]; PushNode[signalTC,1];
	  END;
	  
      21  => -- typeid					::= id . id
	  BEGIN
	  PushHash[v[top]];  PushHash[v[top+2]];
	  PushNode[typeDollar,2];
	  END;
	  
      22  => -- typeid					::= id id
	  BEGIN
	  PushHash[v[top+1]];  PushHash[v[top]];
	  PushNode[discrimTC,2];
	  END;
	  
      23  => -- typeid					::= id typeid
	  BEGIN
	  PushHash[v[top]];  PushNode[discrimTC,2];
	  END;
	  
      24  => -- typeid					::= id $ id
	  BEGIN
	  PushHash[v[top]];  PushHash[v[top+2]];
	  PushNode[typeDollar,2];
	  END;
	  
      25  => -- typecons				::= POINTER TO typeexp
	    -- typecons					::= @ typeexp
	  PushNode[pointerTC,1];
	  
      26  => -- typecons				::= LONG typeexp
	  PushNode[longTC,1];
	  
      27  => -- sum					::= sum addop product
	    -- relation					::= sum relationtail 
	  PushNode[v[top+1],2];
	  
      28  => -- addop					::= +
	  vTop ← Tree.NodeName[plus];
      29  => -- addop					::= - 
	  vTop ← Tree.NodeName[minus];
	  
      30  => -- relop					::= = 
	  vTop ← Tree.NodeName[relE];
      31  => -- relop					::= # 
	  vTop ← Tree.NodeName[relN];
      32  => -- relop					::= < 
	  vTop ← Tree.NodeName[relL];
      33  => -- relop					::= <= 
	  vTop ← Tree.NodeName[relLE];
      34  => -- relop					::= > 
	  vTop ← Tree.NodeName[relG];
      35  => -- relop					::= >= 
	  vTop ← Tree.NodeName[relGE];
	  
      36  => -- product					::= product multop factor 
	  PushNode[v[top+1],2];
	  
      37  => -- multop					::= * 
	  vTop ← Tree.NodeName[times];
      38  => -- multop					::= / 
	  vTop ← Tree.NodeName[div];
      39  => -- multop					::= MOD 
	  vTop ← Tree.NodeName[mod];
	  
      40  => -- factor					::= - primary 
	  PushNode[uminus,1];
	  
      41  => -- primary					::= num
	  BEGIN
	  PushLit[v[top]];  PushNode[int,1]
	  END;
	  
      42  => -- primary					::= lnum 
	  BEGIN
	  PushLit[v[top]];  PushNode[mwconst,1];
	  PushNode[lint,1];
	  END;
	  
      43  => -- primary					::= card
	  BEGIN
	  PushLit[v[top]];  PushNode[card,1];
	  END;
	  
      44  => -- primary					::= lcard 
	  BEGIN
	  PushLit[v[top]];  PushNode[mwconst,1];
	  PushNode[lcard,1];
	  END;
	  
      45  => -- primary					::= char
	  BEGIN
	  PushLit[v[top]];  PushNode[clit,1];
	  END;
	  
      46  => -- primary					::= string 
	  PushStringLit[v[top]];
	  
      47  => -- primary					::= NIL
	  BEGIN
	  PushTree[Tree.Null]; PushNode[nil,1];
	  END;
	  
      48  => -- primary					::= NIL [ typeexp ]
	  PushNode[nil,1];
	  
      49  => -- primary					::= prefixop [ explist ] 
	  BEGIN
	  PushList[v[top+2]];  PushNode[v[top],1];
	  END;
	  
      50  => -- primary					::= typeop [ typeexp ] 
	  PushNode[v[top],1];
	  
      51  => -- primary 					::= @ lhs
	  PushNode[addr,1];
	  
      52  => -- primary					::= DESCRIPTOR [ desclist ] 
	  PushNode[arraydesc,1];
	  
      53  => -- primary					::= primary %
	  BEGIN
	  PushTree[Tree.Null]; PushNode[loophole,2];
	  END;
	  
      54  => -- primary					::= primary % ( typeexp )
	  PushNode[loophole,2];
	  
      55  => -- lhs					::= id 
	  PushHash[v[top]];
	  
      56  => -- lhs					::= LOOPHOLE [ exp ]  
	  BEGIN
	  PushTree[Tree.Null]; PushNode[loophole,2];
	  END;
	  
      57  => -- lhs					::= LOOPHOLE [ exp , typeexp ]  
	  PushNode[loophole,2];
	  
      58  => -- lhs					::= MEMORY [ exp ] 
	  PushNode[memory,1];
	  
      59  => -- lhs					::= id $ id 
	  BEGIN
	-- go to file named by first id to lookup second id 
	  PushHash[v[top]];  PushHash[v[top+2]];
	  PushNode[fileDollar,2];
	  END;
	  
      60  => -- lhs					::= num $ id 
	    -- lhs					::= card $ id
	  BEGIN
	-- go to frame named by first id to lookup second id 
	  PushLit[v[top]];  PushHash[v[top+2]];
	  PushNode[frameDollar,2];
	  END;
	  
      61  => -- qualifier					::= [ explist ]
	  BEGIN
	  PushList[v[top+1]]; PushNode[apply,2];
	  END;
	  
      62  => -- qualifier					::= . id 
	  BEGIN
	  PushHash[v[top+1]];  PushNode[dot,2];
	  END;
	  
      63  => -- qualifier					::= ↑ 
	  PushNode[uparrow,1];
	  
      64  => -- prefixop					::= LONG 
	  vTop ← Tree.NodeName[lengthen];
      65  => -- prefixop					::= ABS 
	  vTop ← Tree.NodeName[abs];
      66  => -- prefixop					::= MIN 
	  vTop ← Tree.NodeName[min];
      67  => -- prefixop					::= MAX 
	  vTop ← Tree.NodeName[max];
      68  => -- prefixop					::= BASE 
	  vTop ← Tree.NodeName[base];
      69  => -- prefixop					::= LENGTH 
	  vTop ← Tree.NodeName[length];
	  
      70  => -- typeop					::= SIZE 
	  vTop ← Tree.NodeName[size];
      71  => -- typeop					::= FIRST 
	  vTop ← Tree.NodeName[first];
      72  => -- typeop					::= LAST 
	  vTop ← Tree.NodeName[last];
	  
      73  => -- interval					::= [ bounds ]
	  PushNode[intCC,1];
      74  => -- interval					::= [ bounds )
	  PushNode[intCO,1];
      75  => -- interval					::= ( bounds ]
	  PushNode[intOC,1];
      76  => -- interval					::= ( bounds )
	  PushNode[intOO,1];
      77  => -- interval					::= [ exp ! exp ]
	  BEGIN
	  PushList[2];  PushNode[bang,1];
	  END;
	  
      78  => -- bounds					::= exp .. exp
	  PushList[2];
	  
      79  => -- desclist					::= exp , exp 
	  BEGIN
	  PushTree[Tree.Null];  PushList[3];
	  END;
	  
      80  => -- desclist					::= exp , exp , typeexp 
	  PushList[3];
	  
      81  => -- typeexp					::= typeid
	    -- typeexp					::= typecons
	    -- desclist					::= exp 
	    -- exp					::= sum
	    -- sum					::= product
	    -- product					::= factor
	    -- factor					::= primary 
	    -- primary					::= lhs
	    -- lhs					::= ( exp )  
	    -- lhs					::= lhs qualifier 
	    -- relationtail				::= relop sum 
	  NULL;
	  
      82  => -- explist					::= exp
	    -- statementlist				::= statement
	  vTop ← 1;
	  
      83  => -- explist					::= explist , exp
	  vTop ← v[top]+1;
	  
      84  => -- explist					::= 
	  vTop ← 0;  -- empty expression list
	  
      ENDCASE => SIGNAL DebugOps.ParseError[l[top]]; -- error or unimplemented
      
      v[top] ← vTop;
    ENDLOOP;
    RETURN
    END;
    
  END.