DIRECTORY
	ThreeC4BaseDecl1Def,
	ThreeC4CProdAbGramDef,
	ThreeC4BasicAbTypesDef;

ThreeC4CProdAbGramImpl: CEDAR PROGRAM IMPORTS ThreeC4CProdAbGramDef EXPORTS ThreeC4CProdAbGramDef= 
BEGIN
OPEN ThreeC4BaseDecl1Def, ThreeC4CProdAbGramDef, ThreeC4BasicAbTypesDef;

-- ConcreteProductionProd

ConcreteProductionProdProcs: PUBLIC ConcreteProductionNodeProcs ←
	NEW[ConcreteProductionNodeProcsBody ← [ConcreteProductionProdCollectProductions, ConcreteProductionProdImplFileCode, ConcreteProductionProdLinkFileCode, ConcreteProductionProdSyntaxFileCodes]];

BuildConcreteProductionProdNode: PUBLIC PROC[position: INT, length: INT, ModId: ModIdNode, ConcreteRightSideList: ConcreteRightSideListNode, BuildExp: BuildExpNode]
	RETURNS[ConcreteProductionNode] =
		BEGIN
		data: ConcreteProductionProdData ←
			NEW[ConcreteProductionProdDataBody←[
			ModId, ConcreteRightSideList, BuildExp]];
		RETURN[NEW[ConcreteProductionNodeBody←[position, length, ConcreteProductionProdProcs, data]]];
		END;


-- ConcreteRightSideListemptyProd

ConcreteRightSideListemptyProdProcs: PUBLIC ConcreteRightSideListNodeProcs ←
	NEW[ConcreteRightSideListNodeProcsBody ← [ConcreteRightSideListemptyProdFormRightSideContext, ConcreteRightSideListemptyProdFormNameList, ConcreteRightSideListemptyProdFormTypeList, ConcreteRightSideListemptyProdFormNodeVarAssignCode, ConcreteRightSideListemptyProdSyntaxRightSideFileCode]];

BuildConcreteRightSideListemptyProdNode: PUBLIC PROC[position: INT, length: INT]
	RETURNS[ConcreteRightSideListNode] =
		BEGIN
		RETURN[NEW[ConcreteRightSideListNodeBody←[position, length, ConcreteRightSideListemptyProdProcs, NIL]]];
		END;


-- ConcreteRightSideListoneProd

ConcreteRightSideListoneProdProcs: PUBLIC ConcreteRightSideListNodeProcs ←
	NEW[ConcreteRightSideListNodeProcsBody ← [ConcreteRightSideListoneProdFormRightSideContext, ConcreteRightSideListoneProdFormNameList, ConcreteRightSideListoneProdFormTypeList, ConcreteRightSideListoneProdFormNodeVarAssignCode, ConcreteRightSideListoneProdSyntaxRightSideFileCode]];

BuildConcreteRightSideListoneProdNode: PUBLIC PROC[position: INT, length: INT, ConcreteRightSideItem: ConcreteRightSideItemNode]
	RETURNS[ConcreteRightSideListNode] =
		BEGIN
		data: ConcreteRightSideListoneProdData ←
			NEW[ConcreteRightSideListoneProdDataBody←[
			ConcreteRightSideItem]];
		RETURN[NEW[ConcreteRightSideListNodeBody←[position, length, ConcreteRightSideListoneProdProcs, data]]];
		END;


-- ConcreteRightSideListmanyProd

ConcreteRightSideListmanyProdProcs: PUBLIC ConcreteRightSideListNodeProcs ←
	NEW[ConcreteRightSideListNodeProcsBody ← [ConcreteRightSideListmanyProdFormRightSideContext, ConcreteRightSideListmanyProdFormNameList, ConcreteRightSideListmanyProdFormTypeList, ConcreteRightSideListmanyProdFormNodeVarAssignCode, ConcreteRightSideListmanyProdSyntaxRightSideFileCode]];

BuildConcreteRightSideListmanyProdNode: PUBLIC PROC[position: INT, length: INT, ConcreteRightSideList: ConcreteRightSideListNode, ConcreteRightSideItem: ConcreteRightSideItemNode]
	RETURNS[ConcreteRightSideListNode] =
		BEGIN
		data: ConcreteRightSideListmanyProdData ←
			NEW[ConcreteRightSideListmanyProdDataBody←[
			ConcreteRightSideList, ConcreteRightSideItem]];
		RETURN[NEW[ConcreteRightSideListNodeBody←[position, length, ConcreteRightSideListmanyProdProcs, data]]];
		END;


-- ConcreteRightSideItemropeProd

ConcreteRightSideItemropeProdProcs: PUBLIC ConcreteRightSideItemNodeProcs ←
	NEW[ConcreteRightSideItemNodeProcsBody ← [ConcreteRightSideItemropeProdFormRightSideContext, ConcreteRightSideItemropeProdFormNameList, ConcreteRightSideItemropeProdFormTypeList, ConcreteRightSideItemropeProdFormNodeVarAssignCode, ConcreteRightSideItemropeProdSyntaxRightSideFileCode]];

BuildConcreteRightSideItemropeProdNode: PUBLIC PROC[position: INT, length: INT, Rope: RopeNode]
	RETURNS[ConcreteRightSideItemNode] =
		BEGIN
		data: ConcreteRightSideItemropeProdData ←
			NEW[ConcreteRightSideItemropeProdDataBody←[
			Rope]];
		RETURN[NEW[ConcreteRightSideItemNodeBody←[position, length, ConcreteRightSideItemropeProdProcs, data]]];
		END;


-- ConcreteRightSideItemmodIdProd

ConcreteRightSideItemmodIdProdProcs: PUBLIC ConcreteRightSideItemNodeProcs ←
	NEW[ConcreteRightSideItemNodeProcsBody ← [ConcreteRightSideItemmodIdProdFormRightSideContext, ConcreteRightSideItemmodIdProdFormNameList, ConcreteRightSideItemmodIdProdFormTypeList, ConcreteRightSideItemmodIdProdFormNodeVarAssignCode, ConcreteRightSideItemmodIdProdSyntaxRightSideFileCode]];

BuildConcreteRightSideItemmodIdProdNode: PUBLIC PROC[position: INT, length: INT, ModId: ModIdNode]
	RETURNS[ConcreteRightSideItemNode] =
		BEGIN
		data: ConcreteRightSideItemmodIdProdData ←
			NEW[ConcreteRightSideItemmodIdProdDataBody←[
			ModId]];
		RETURN[NEW[ConcreteRightSideItemNodeBody←[position, length, ConcreteRightSideItemmodIdProdProcs, data]]];
		END;


-- BuildExpmodIdProd

BuildExpmodIdProdProcs: PUBLIC BuildExpNodeProcs ←
	NEW[BuildExpNodeProcsBody ← [BuildExpmodIdProdFormBuildExpCode, BuildExpmodIdProdFormBuildPositionCode, BuildExpmodIdProdFormBuildLengthCode]];

BuildBuildExpmodIdProdNode: PUBLIC PROC[position: INT, length: INT, ModId: ModIdNode]
	RETURNS[BuildExpNode] =
		BEGIN
		data: BuildExpmodIdProdData ←
			NEW[BuildExpmodIdProdDataBody←[
			ModId]];
		RETURN[NEW[BuildExpNodeBody←[position, length, BuildExpmodIdProdProcs, data]]];
		END;


-- BuildExpbuildNodeProd

BuildExpbuildNodeProdProcs: PUBLIC BuildExpNodeProcs ←
	NEW[BuildExpNodeProcsBody ← [BuildExpbuildNodeProdFormBuildExpCode, BuildExpbuildNodeProdFormBuildPositionCode, BuildExpbuildNodeProdFormBuildLengthCode]];

BuildBuildExpbuildNodeProdNode: PUBLIC PROC[position: INT, length: INT, ModId: ModIdNode, IntervalExp: IntervalExpNode, BuildExpList: BuildExpListNode]
	RETURNS[BuildExpNode] =
		BEGIN
		data: BuildExpbuildNodeProdData ←
			NEW[BuildExpbuildNodeProdDataBody←[
			ModId, IntervalExp, BuildExpList]];
		RETURN[NEW[BuildExpNodeBody←[position, length, BuildExpbuildNodeProdProcs, data]]];
		END;


-- BuildExpListemptyProd

BuildExpListemptyProdProcs: PUBLIC BuildExpListNodeProcs ←
	NEW[BuildExpListNodeProcsBody ← [BuildExpListemptyProdFormBuildExpListCode, BuildExpListemptyProdFormBuildPositionCode, BuildExpListemptyProdFormBuildLengthCode]];

BuildBuildExpListemptyProdNode: PUBLIC PROC[position: INT, length: INT]
	RETURNS[BuildExpListNode] =
		BEGIN
		RETURN[NEW[BuildExpListNodeBody←[position, length, BuildExpListemptyProdProcs, NIL]]];
		END;


-- BuildExpListoneProd

BuildExpListoneProdProcs: PUBLIC BuildExpListNodeProcs ←
	NEW[BuildExpListNodeProcsBody ← [BuildExpListoneProdFormBuildExpListCode, BuildExpListoneProdFormBuildPositionCode, BuildExpListoneProdFormBuildLengthCode]];

BuildBuildExpListoneProdNode: PUBLIC PROC[position: INT, length: INT, BuildExp: BuildExpNode]
	RETURNS[BuildExpListNode] =
		BEGIN
		data: BuildExpListoneProdData ←
			NEW[BuildExpListoneProdDataBody←[
			BuildExp]];
		RETURN[NEW[BuildExpListNodeBody←[position, length, BuildExpListoneProdProcs, data]]];
		END;


-- BuildExpListmanyProd

BuildExpListmanyProdProcs: PUBLIC BuildExpListNodeProcs ←
	NEW[BuildExpListNodeProcsBody ← [BuildExpListmanyProdFormBuildExpListCode, BuildExpListmanyProdFormBuildPositionCode, BuildExpListmanyProdFormBuildLengthCode]];

BuildBuildExpListmanyProdNode: PUBLIC PROC[position: INT, length: INT, BuildExpList: BuildExpListNode, BuildExp: BuildExpNode]
	RETURNS[BuildExpListNode] =
		BEGIN
		data: BuildExpListmanyProdData ←
			NEW[BuildExpListmanyProdDataBody←[
			BuildExpList, BuildExp]];
		RETURN[NEW[BuildExpListNodeBody←[position, length, BuildExpListmanyProdProcs, data]]];
		END;


-- IntervalExpnoneProd

IntervalExpnoneProdProcs: PUBLIC IntervalExpNodeProcs ←
	NEW[IntervalExpNodeProcsBody ← [IntervalExpnoneProdFormIntervalBuildPositionCode, IntervalExpnoneProdFormIntervalBuildLengthCode]];

BuildIntervalExpnoneProdNode: PUBLIC PROC[position: INT, length: INT]
	RETURNS[IntervalExpNode] =
		BEGIN
		RETURN[NEW[IntervalExpNodeBody←[position, length, IntervalExpnoneProdProcs, NIL]]];
		END;


-- IntervalExppresentProd

IntervalExppresentProdProcs: PUBLIC IntervalExpNodeProcs ←
	NEW[IntervalExpNodeProcsBody ← [IntervalExppresentProdFormIntervalBuildPositionCode, IntervalExppresentProdFormIntervalBuildLengthCode]];

BuildIntervalExppresentProdNode: PUBLIC PROC[position: INT, length: INT, IntervalFormform: IntervalForm, ModIdleft: ModIdNode, ModIdright: ModIdNode]
	RETURNS[IntervalExpNode] =
		BEGIN
		data: IntervalExppresentProdData ←
			NEW[IntervalExppresentProdDataBody←[
			IntervalFormform, ModIdleft, ModIdright]];
		RETURN[NEW[IntervalExpNodeBody←[position, length, IntervalExppresentProdProcs, data]]];
		END;

END..