-- File: ParseDclsImpl.mesa
-- Last edited by Neil Gunther, 30-Nov-87 13:43:44
-- The original file was (mysteriously) truncated at the first SELECTion arm of ProcessQueue.
-- According to ParseTables.grammar the first 60 productions [0..59] are missing.

DIRECTORY
  PrintDclsDefs USING [PrintDeclarations, PrintFunctionHead, MergeAttributes],
  PrintStmtsDefs USING [PrintStatement],
  ParseDefs USING [Value, Value2, commentString, ParseStmts, ParseExpr1, ParseExpr2],
  PrintingDefs USING [GetComment, PrintComments, OutCode],
  Storage USING [FreeString],
  TreesDefs USING [FreeTree, MakeNode],
  ParseInterface USING [ActionEntry, ProductionInfo];

ParseDclsImpl: PROGRAM IMPORTS PrintingDefs, PrintStmtsDefs, PrintDclsDefs, ParseDefs, Storage, TreesDefs EXPORTS ParseDefs = BEGIN

  -- Problems: (1) This doesn't parse the comma (,) operator.
  --           (2) This doesn't parse typedef'ed type declarations.

  -- global variables

  temp: ParseDefs.Value;
  temp2: ParseDefs.Value2;
  atemp: LONG POINTER TO LONG STRING;
  avtop: LONG POINTER TO LONG STRING;

  -- local data base (supplied by parser)

  q: LONG DESCRIPTOR FOR ARRAY OF ParseInterface.ActionEntry;
  v: LONG DESCRIPTOR FOR ARRAY OF ParseDefs.Value;
  v2: LONG DESCRIPTOR FOR ARRAY OF ParseDefs.Value2;
  l: LONG DESCRIPTOR FOR ARRAY OF CARDINAL;
  prodData: LONG DESCRIPTOR FOR ARRAY OF ParseInterface.ProductionInfo;

  -- initialization/termination

  AssignDescriptors: PUBLIC PROCEDURE [
    qd: LONG DESCRIPTOR FOR ARRAY OF ParseInterface.ActionEntry,
    vd: LONG DESCRIPTOR FOR ARRAY OF ParseDefs.Value,
    v2d: LONG DESCRIPTOR FOR ARRAY OF ParseDefs.Value2,
    ld: LONG DESCRIPTOR FOR ARRAY OF CARDINAL,
    pp: LONG DESCRIPTOR FOR ARRAY OF ParseInterface.ProductionInfo] =
    { q ← qd; v ← vd; v2 ← v2d; l ← ld; prodData ← pp; };

  -- the interpretation rules

  ProcessQueue: PUBLIC PROCEDURE [qI, top: CARDINAL] = {

    rule: [0..377B];
    FOR i: CARDINAL IN [0..qI) DO
      top ← top - q[i].tag.pLength + 1;
      avtop ← @v[top];
      atemp ← @temp;
      rule ← prodData[q[i].transition].rule;
      SELECT rule FROM

        0  =>  -- TYPE: ParseInterface
          -- TABLE: ParseTables      EXPORTS: SELF
          -- GOAL:  goal

          --TERMINALS:
          -- FCON	ICON	NAME	STRING	
          -- a