DIRECTORY
	ThreeC4BaseDecl1Def,
	ThreeC4RecFcnImplAbGramDef,
	ThreeC4Support,
	ThreeC4BaseDecl2Def;

ThreeC4RecFcnImplImpl3Impl: CEDAR PROGRAM IMPORTS ThreeC4RecFcnImplAbGramDef, ThreeC4Support EXPORTS ThreeC4RecFcnImplAbGramDef= 
BEGIN
OPEN ThreeC4BaseDecl1Def, ThreeC4RecFcnImplAbGramDef, ThreeC4Support, ThreeC4BaseDecl2Def;
RecExpressionwithWhereListProdFormFcnImplGraph: PUBLIC PROC[ref: REF ANY, lookup: LookupContextNode, graph: FcnImplGraphNode] RETURNS[temp0: FcnImplGraphNode, temp1: SlotListNode, temp2: CallGraphNodeNode] =
BEGIN
tree: RecExpressionNode← NARROW[ref];
BEGIN
ENABLE ThreeC4Support.GetSourceInfo => RESUME[tree.position, tree.length];
treeData: RecExpressionwithWhereListProdData ← NARROW[tree.data];
BEGIN
newGraph: FcnImplGraphNode;
graph4: FcnImplGraphNode;
cgNode: CallGraphNodeNode;
graph3: FcnImplGraphNode;
slots: SlotListNode;
expNode: CallGraphNodeNode;
graph2: FcnImplGraphNode;
whereNode: CallGraphNodeNode;
graph1: FcnImplGraphNode;
graph1 ← OpenWithWhereList[graph];
[graph2, whereNode] ← treeData.WhereExpSeq.procs.FormFcnImplWhereGraph[treeData.WhereExpSeq, lookup, graph1];
[graph3, slots, expNode] ← treeData.RecExpression.procs.FormFcnImplGraph[treeData.RecExpression, lookup, graph2];
[graph4, cgNode] ← RecordSequential[graph3, whereNode, expNode];
newGraph ← CloseWithWhereList[graph4];
temp2 ← cgNode;
temp1 ← slots;
temp0 ← newGraph;
END;
END
END;

RecExpressioncondProdFormFcnImplGraph: PUBLIC PROC[ref: REF ANY, lookup: LookupContextNode, graph: FcnImplGraphNode] RETURNS[temp0: FcnImplGraphNode, temp1: SlotListNode, temp2: CallGraphNodeNode] =
BEGIN
tree: RecExpressionNode← NARROW[ref];
BEGIN
ENABLE ThreeC4Support.GetSourceInfo => RESUME[tree.position, tree.length];
treeData: RecExpressioncondProdData ← NARROW[tree.data];
BEGIN
graph3: FcnImplGraphNode;
slotsIf: SlotListNode;
cgNodeIf: CallGraphNodeNode;
graph2: FcnImplGraphNode;
slotsThen: SlotListNode;
cgNodeThen: CallGraphNodeNode;
graph1: FcnImplGraphNode;
slotsElse: SlotListNode;
cgNodeElse: CallGraphNodeNode;
[graph1, slotsElse, cgNodeElse] ← treeData.RecExpressionelseClause.procs.FormFcnImplGraph[treeData.RecExpressionelseClause, lookup, graph];
[graph2, slotsThen, cgNodeThen] ← treeData.RecExpressionthenClause.procs.FormFcnImplGraph[treeData.RecExpressionthenClause, lookup, graph1];
[graph3, slotsIf, cgNodeIf] ← treeData.RecExpressionifClause.procs.FormFcnImplGraph[treeData.RecExpressionifClause, lookup, graph2];
[temp0, temp1, temp2] ← RecordCondition[graph3, slotsIf, cgNodeIf, slotsThen, cgNodeThen, slotsElse, cgNodeElse];
END;
END
END;

RecExpressioncallProdFormFcnImplGraph: PUBLIC PROC[ref: REF ANY, lookup: LookupContextNode, graph: FcnImplGraphNode] RETURNS[temp0: FcnImplGraphNode, temp1: SlotListNode, temp2: CallGraphNodeNode] =
BEGIN
tree: RecExpressionNode← NARROW[ref];
BEGIN
ENABLE ThreeC4Support.GetSourceInfo => RESUME[tree.position, tree.length];
treeData: RecExpressioncallProdData ← NARROW[tree.data];
BEGIN
graph1: FcnImplGraphNode;
slots: SlotListNode;
cgn: CallGraphNodeNode;
[graph1, slots, cgn] ← treeData.RecExpSeq.procs.FormFcnImplGraph[treeData.RecExpSeq, lookup, graph];
[temp0, temp1, temp2] ← RecordCall[graph1, lookup, treeData.Identifier, slots, cgn];
END;
END
END;

RecExpressionseqProdFormFcnImplGraph: PUBLIC PROC[ref: REF ANY, lookup: LookupContextNode, graph: FcnImplGraphNode] RETURNS[temp0: FcnImplGraphNode, temp1: SlotListNode, temp2: CallGraphNodeNode] =
BEGIN
tree: RecExpressionNode← NARROW[ref];
BEGIN
ENABLE ThreeC4Support.GetSourceInfo => RESUME[tree.position, tree.length];
treeData: RecExpressionseqProdData ← NARROW[tree.data];
[temp0, temp1, temp2] ← treeData.RecExpSeq.procs.FormFcnImplGraph[treeData.RecExpSeq, lookup, graph];
END
END;

RecExpressionidProdFormFcnImplGraph: PUBLIC PROC[ref: REF ANY, lookup: LookupContextNode, graph: FcnImplGraphNode] RETURNS[temp0: FcnImplGraphNode, temp1: SlotListNode, temp2: CallGraphNodeNode] =
BEGIN
tree: RecExpressionNode← NARROW[ref];
BEGIN
ENABLE ThreeC4Support.GetSourceInfo => RESUME[tree.position, tree.length];
treeData: RecExpressionidProdData ← NARROW[tree.data];
[temp0, temp1, temp2] ← RecordSimpleVarUse[graph, lookup, treeData.Identifier];
END
END;

RecExpressionmodIdProdFormFcnImplGraph: PUBLIC PROC[ref: REF ANY, lookup: LookupContextNode, graph: FcnImplGraphNode] RETURNS[temp0: FcnImplGraphNode, temp1: SlotListNode, temp2: CallGraphNodeNode] =
BEGIN
tree: RecExpressionNode← NARROW[ref];
BEGIN
ENABLE ThreeC4Support.GetSourceInfo => RESUME[tree.position, tree.length];
treeData: RecExpressionmodIdProdData ← NARROW[tree.data];
[temp0, temp1, temp2] ← RecordModIdUse[graph, lookup, treeData.Identifiera, treeData.Identifierb];
END
END;

RecExpressionropeProdFormFcnImplGraph: PUBLIC PROC[ref: REF ANY, lookup: LookupContextNode, graph: FcnImplGraphNode] RETURNS[temp0: FcnImplGraphNode, temp1: SlotListNode, temp2: CallGraphNodeNode] =
BEGIN
tree: RecExpressionNode← NARROW[ref];
BEGIN
ENABLE ThreeC4Support.GetSourceInfo => RESUME[tree.position, tree.length];
treeData: RecExpressionropeProdData ← NARROW[tree.data];
[temp0, temp1, temp2] ← RecordLiteralUse[graph, tree.position];
END
END;

RecExpressionnumbProdFormFcnImplGraph: PUBLIC PROC[ref: REF ANY, lookup: LookupContextNode, graph: FcnImplGraphNode] RETURNS[temp0: FcnImplGraphNode, temp1: SlotListNode, temp2: CallGraphNodeNode] =
BEGIN
tree: RecExpressionNode← NARROW[ref];
BEGIN
ENABLE ThreeC4Support.GetSourceInfo => RESUME[tree.position, tree.length];
treeData: RecExpressionnumbProdData ← NARROW[tree.data];
[temp0, temp1, temp2] ← RecordLiteralUse[graph, tree.position];
END
END;

RecExpressionsourcePositionProdFormFcnImplGraph: PUBLIC PROC[ref: REF ANY, lookup: LookupContextNode, graph: FcnImplGraphNode] RETURNS[temp0: FcnImplGraphNode, temp1: SlotListNode, temp2: CallGraphNodeNode] =
BEGIN
tree: RecExpressionNode← NARROW[ref];
BEGIN
ENABLE ThreeC4Support.GetSourceInfo => RESUME[tree.position, tree.length];
treeData: RecExpressionsourcePositionProdData ← NARROW[tree.data];
[temp0, temp1, temp2] ← RecordLiteralUse[graph, tree.position];
END
END;

RecExpressionsourceLengthProdFormFcnImplGraph: PUBLIC PROC[ref: REF ANY, lookup: LookupContextNode, graph: FcnImplGraphNode] RETURNS[temp0: FcnImplGraphNode, temp1: SlotListNode, temp2: CallGraphNodeNode] =
BEGIN
tree: RecExpressionNode← NARROW[ref];
BEGIN
ENABLE ThreeC4Support.GetSourceInfo => RESUME[tree.position, tree.length];
treeData: RecExpressionsourceLengthProdData ← NARROW[tree.data];
[temp0, temp1, temp2] ← RecordLiteralUse[graph, tree.position];
END
END;

RecExpSeqemptyProdFormFcnImplGraph: PUBLIC PROC[ref: REF ANY, lookup: LookupContextNode, graph: FcnImplGraphNode] RETURNS[temp0: FcnImplGraphNode, temp1: SlotListNode, temp2: CallGraphNodeNode] =
BEGIN
tree: RecExpSeqNode← NARROW[ref];
BEGIN
ENABLE ThreeC4Support.GetSourceInfo => RESUME[tree.position, tree.length];
temp2 ← BuildEmptyCallGraphNode[];
temp1 ← BuildEmptySlotList[];
temp0 ← FakeCopyFcnImplGraph[graph];
END
END;

RecExpSeqoneProdFormFcnImplGraph: PUBLIC PROC[ref: REF ANY, lookup: LookupContextNode, graph: FcnImplGraphNode] RETURNS[temp0: FcnImplGraphNode, temp1: SlotListNode, temp2: CallGraphNodeNode] =
BEGIN
tree: RecExpSeqNode← NARROW[ref];
BEGIN
ENABLE ThreeC4Support.GetSourceInfo => RESUME[tree.position, tree.length];
treeData: RecExpSeqoneProdData ← NARROW[tree.data];
[temp0, temp1, temp2] ← treeData.RecExpression.procs.FormFcnImplGraph[treeData.RecExpression, lookup, graph];
END
END;

RecExpSeqmanyProdFormFcnImplGraph: PUBLIC PROC[ref: REF ANY, lookup: LookupContextNode, graph: FcnImplGraphNode] RETURNS[temp0: FcnImplGraphNode, temp1: SlotListNode, temp2: CallGraphNodeNode] =
BEGIN
tree: RecExpSeqNode← NARROW[ref];
BEGIN
ENABLE ThreeC4Support.GetSourceInfo => RESUME[tree.position, tree.length];
treeData: RecExpSeqmanyProdData ← NARROW[tree.data];
BEGIN
newGraph: FcnImplGraphNode;
cgn: CallGraphNodeNode;
slots: SlotListNode;
graph2: FcnImplGraphNode;
slotsb: SlotListNode;
cgnb: CallGraphNodeNode;
graph1: FcnImplGraphNode;
slotsa: SlotListNode;
cgna: CallGraphNodeNode;
[graph1, slotsa, cgna] ← treeData.RecExpSeqa.procs.FormFcnImplGraph[treeData.RecExpSeqa, lookup, graph];
[graph2, slotsb, cgnb] ← treeData.RecExpSeqb.procs.FormFcnImplGraph[treeData.RecExpSeqb, lookup, graph1];
slots ← ConcatSlotList[slotsa, slotsb];
[newGraph, cgn] ← RecordParallel[graph2, cgna, cgnb];
temp2 ← cgn;
temp1 ← slots;
temp0 ← newGraph;
END;
END
END;

WhereExpSeqoneProdFormFcnImplWhereGraph: PUBLIC PROC[ref: REF ANY, lookup: LookupContextNode, graph: FcnImplGraphNode] RETURNS[temp0: FcnImplGraphNode, temp1: CallGraphNodeNode] =
BEGIN
tree: WhereExpSeqNode← NARROW[ref];
BEGIN
ENABLE ThreeC4Support.GetSourceInfo => RESUME[tree.position, tree.length];
treeData: WhereExpSeqoneProdData ← NARROW[tree.data];
BEGIN
graph1: FcnImplGraphNode;
slots: SlotListNode;
cgn1: CallGraphNodeNode;
[graph1, slots, cgn1] ← treeData.RecExpression.procs.FormFcnImplGraph[treeData.RecExpression, lookup, graph];
[temp0, temp1] ← RecordAssignment[graph1, treeData.IdList.procs.FormNameList[treeData.IdList], slots, cgn1];
END;
END
END;

WhereExpSeqmanyProdFormFcnImplWhereGraph: PUBLIC PROC[ref: REF ANY, lookup: LookupContextNode, graph: FcnImplGraphNode] RETURNS[temp0: FcnImplGraphNode, temp1: CallGraphNodeNode] =
BEGIN
tree: WhereExpSeqNode← NARROW[ref];
BEGIN
ENABLE ThreeC4Support.GetSourceInfo => RESUME[tree.position, tree.length];
treeData: WhereExpSeqmanyProdData ← NARROW[tree.data];
BEGIN
graph2: FcnImplGraphNode;
cgna: CallGraphNodeNode;
graph1: FcnImplGraphNode;
cgnb: CallGraphNodeNode;
[graph1, cgnb] ← treeData.WhereExpSeqb.procs.FormFcnImplWhereGraph[treeData.WhereExpSeqb, lookup, graph];
[graph2, cgna] ← treeData.WhereExpSeqa.procs.FormFcnImplWhereGraph[treeData.WhereExpSeqa, lookup, graph1];
[temp0, temp1] ← RecordSequential[graph2, cgnb, cgna];
END;
END
END;

END..