-- file PackTreeBuild.mesa rewritten by PGS, 28-Sep-81 14:56
-- file PackTreeBuild.mesa rewritten by PGS, 2-Apr-81 17:18
-- file PackTreeBuild.mesa rewritten by PGS, 2-Apr-81 17:15
-- file PackTreeBuild.mesa rewritten by PGS, 3-Sep-80 18:31
-- grammar last edited by Lewis on 1-Apr-81 16:45:10
-- rules last edited by Lewis on 2-Apr-81 17:17:34
DIRECTORY
P1: FROM "PackParseDefs",
SymTabDefs USING [HTIndex, HTNull],
ParseTable USING [ActionEntry, Production, ProductionInfo, Symbol, tokenID],
Tree: FROM "PackTree" USING [Link, Null, NullProcs],
TreeOps: FROM "PackTreeOps" USING [
PopTree, PushTree, PushHash, PushList, PushNode, SetAttr, SetInfo];
PackTreeBuild: PROGRAM
IMPORTS TreeOps
EXPORTS Tree, P1 =
BEGIN OPEN TreeOps;
root: PUBLIC Tree.Link ← Tree.Null; -- root of packaging description tree
ProdData: TYPE = ARRAY ParseTable.Production OF ParseTable.ProductionInfo;
-- local data base (supplied by parser)
v: DESCRIPTOR FOR ARRAY OF UNSPECIFIED;
l: DESCRIPTOR FOR ARRAY OF CARDINAL;
q: DESCRIPTOR FOR ARRAY OF ParseTable.ActionEntry;
proddata: LONG POINTER TO ProdData;
AssignDescriptors: PUBLIC PROC [
qd: DESCRIPTOR FOR ARRAY OF ParseTable.ActionEntry,
vd: DESCRIPTOR FOR ARRAY OF UNSPECIFIED,
ld: DESCRIPTOR FOR ARRAY OF CARDINAL,
pp: LONG POINTER TO ProdData] =
{q ← qd; v ← vd; l ← ld; proddata ← pp};
-- the interpretation rules
LinkToSource: PROC [index: CARDINAL] = INLINE {SetInfo[l[index]]};
exceptMain: BOOLEAN;
primaryComponentId: SymTabDefs.HTIndex;
ProcessQueue: PUBLIC PROC [qI, top: CARDINAL] =
BEGIN
reductionRule: [0..377B];
i: CARDINAL;
save, save2: Tree.Link;
vTop: UNSPECIFIED;
FOR i IN [0 .. qI) DO
top ← top-q[i].tag.pLength+1; vTop ← v[top];
reductionRule ← proddata[q[i].transition].rule;
SELECT reductionRule FROM
0 => --
--TYPE: ParseTable
--TABLE: ParseData EXPORTS: SELF
--GOAL: Goal
--TERMINALS:
-- id endOfFile : =
-- [ ] ;
-- , . { }
-- SEGMENT BEGIN END CODE PACK DISCARD
-- EXCEPT MAIN OF FRAME MERGES
--ALIASES:
-- id tokenID
-- . InitialSymbol
-- endOfFile TrueEndOfFile
-- PRODUCTIONS:
-- Goal ::= . PackagingDesc
NULL;
1 => -- PackagingDesc ::= DescSeries endOfFile
{PushList[v[top]]; root ← PopTree[]; PushTree[root]};
2 => -- DescSeries ::= DescItem ;
-- DescSeries ::= DescItem .
vTop ← 1;
3 => -- DescSeries ::= DescSeries DescItem ;
-- DescSeries ::= DescSeries DescItem .
vTop ← v[top]+1;
4 => -- DescItem ::= CodeSegment
-- DescItem ::= FramePack
-- DescItem ::= Merge
-- DescItem ::= MergeFramePack
NULL;
5 => -- CodeSegment ::= id : SEGMENT = SegmentBody
BEGIN
save ← PopTree[];
PushHash[v[top]]; PushTree[save];
PushNode[codeSeg, 2]; LinkToSource[top];
END;
6 => -- SegmentBody ::= { CodePackSeries }
-- SegmentBody ::= BEGIN CodePackSeries END
PushList[v[top+1]];
7 => -- CodePackSeries ::= CodePack
vTop ← 1;
8 => -- CodePackSeries ::= CodePackSeries ; CodePack
vTop ← v[top]+1;
9 => -- CodePackSeries ::= CodePackSeries ;
NULL; -- allows trailing ;
10 => -- CodePack ::= id : CODE PACK = CodePackBody
BEGIN
save ← PopTree[];
PushHash[v[top]]; PushTree[save]; PushTree[Tree.NullProcs];
PushNode[codePack, 3]; SetAttr[1, exceptMain]; LinkToSource[top];
END;
11 => -- CodePack ::= ComponentDesc
BEGIN
PushList[1]; save ← PopTree[];
PushHash[primaryComponentId]; PushTree[save]; PushTree[Tree.NullProcs];
PushNode[unnamedCodePack, 3]; SetAttr[1, FALSE]; LinkToSource[top];
END;
12 => -- CodePack ::= id : DISCARD CODE PACK = CodePackBody
BEGIN
save ← PopTree[];
PushHash[v[top]]; PushTree[save]; PushTree[Tree.NullProcs];
PushNode[discardCodePack, 3]; SetAttr[1, exceptMain]; LinkToSource[top];
END;
13 => -- CodePackBody ::= { ExceptMain CompSeries }
-- CodePackBody ::= BEGIN ExceptMain CompSeries END
PushList[v[top+2]];
14 => -- ExceptMain ::=
exceptMain ← FALSE;
15 => -- ExceptMain ::= EXCEPT [ MAIN ] ;
exceptMain ← TRUE;
16 => -- CompSeries ::= ComponentDesc
vTop ← 1;
17 => -- CompSeries ::= CompSeries ; ComponentDesc
vTop ← v[top]+1;
18 => -- CompSeries ::= CompSeries ;
NULL; -- allows trailing ;
19 => -- ComponentDesc ::= Component
{PushNode[allComp, 1]; LinkToSource[top]};
20 => -- ComponentDesc ::= Component [ ItemList ]
{PushList[v[top+2]]; PushNode[compItems, 2]; LinkToSource[top]};
21 => -- ComponentDesc ::= Component EXCEPT [ ItemList ]
{PushList[v[top+3]]; PushNode[exceptItems, 2]; LinkToSource[top]};
22 => -- ComponentDesc ::= Component EXCEPT PackList
{PushList[v[top+2]]; PushNode[exceptPacks, 2]; LinkToSource[top]};
23 => -- ComponentDesc ::= Component [ ItemList ] EXCEPT PackList
BEGIN
PushList[v[top+5]]; save ← PopTree[];
PushList[v[top+2]]; PushTree[save];
PushNode[itemsExceptPacks, 3]; LinkToSource[top];
END;
24 => -- ComponentDesc ::= Component EXCEPT PackList , [ ItemList ]
BEGIN
PushList[v[top+5]]; save ← PopTree[];
PushList[v[top+2]]; PushTree[save];
PushNode[exceptPacksItems, 3]; LinkToSource[top]
END;
25 => -- ComponentDesc ::= MAIN OF PackList
{PushList[v[top+2]]; PushNode[mainProcs, 1]; LinkToSource[top]};
26 => -- Component ::= OptQualifiedId
{PushList[v[top]]; PushNode[component, 1]; LinkToSource[top]};
27 => -- OptQualifiedId ::= id
{PushHash[v[top]]; vTop ← 1; primaryComponentId ← v[top]};
28 => -- OptQualifiedId ::= OptQualifiedId . id
{PushHash[v[top+2]]; vTop ← v[top]+1; primaryComponentId ← v[top+2]};
29 => -- ItemList ::= Item
vTop ← 1;
30 => -- ItemList ::= ItemList , Item
vTop ← v[top]+1;
31 => -- Item ::= MAIN
PushNode[main, 0];
32 => -- Item ::= id
PushHash[v[top]];
33 => -- PackList ::= id
{PushHash[v[top]]; vTop ← 1};
34 => -- PackList ::= PackList , id
{PushHash[v[top+2]]; vTop ← v[top]+1};
35 => -- FramePack ::= id : FRAME PACK = FramePackBody
BEGIN
save ← PopTree[];
PushHash[v[top]]; PushTree[save];
PushNode[framePack, 2]; LinkToSource[top];
END;
36 => -- FramePackBody ::= { CompSeries }
-- FramePackBody ::= BEGIN CompSeries END
PushList[v[top+1]];
37 => -- Merge ::= id : SEGMENT MERGES SegList = SegmentBody
BEGIN
save ← PopTree[]; PushList[v[top+4]]; save2 ← PopTree[];
PushHash[v[top]]; PushTree[save]; PushTree[save2];
PushNode[merge, 3]; LinkToSource[top]; -- N.B. SegList is 3rd son
END;
38 => -- MergeFramePack ::= id : FRAME PACK MERGES FpList
BEGIN
PushList[v[top+5]]; save ← PopTree[];
PushHash[v[top]]; PushTree[save];
PushNode[mergeFP, 2]; LinkToSource[top];
END;
39 => -- SegList ::= id
-- FpList ::= id
{PushHash[v[top]]; vTop ← 1};
40 => -- SegList ::= SegList , id
-- FpList ::= FpList , id
{PushHash[v[top+2]]; vTop ← v[top]+1};
ENDCASE => ERROR;
v[top] ← vTop;
ENDLOOP;
END;
TokenValue: PUBLIC PROC [s: ParseTable.Symbol] RETURNS [UNSPECIFIED] =
BEGIN
RETURN[SELECT s FROM
ParseTable.tokenID => SymTabDefs.HTNull,
ENDCASE => 0];
END;
END.