-- ThreeC4OtherModItemsImpl.ThreeC4 -- Sturgis, June 28, 1986 12:48:41 pm PDT Include[ThreeC4BaseDecl, ThreeC4RecFcnDecl, ThreeC4BasicAbTypes, ThreeC4OtherModItemsAbGram]; ThreeC4OtherModItemsImpl: Module = Begin for BaseItems.baseTypes: AbstractProduction[IdList] let CollectModuleValueTypes[tree, file, context] _ RecordMultipleBaseTypes[IdList, file, context] let CollectModuleFunctionTypes[tree, file, context] _ FakeCopyContextForConditional[context] let DefFileCode[tree, context, usage] _ let ImplFileCode[tree, context, usage] _ ; for BaseItems.enumBaseType: AbstractProduction[Identifier, IdList] let CollectModuleValueTypes[tree, file, context] _ RecordEnumeratedBaseType[context, name, file, names, codeName] where name _ BuildName[Identifier] where names _ FormNameList[IdList] where codeName _ RopeCode1["%g", IdFill[Identifier]] let CollectModuleFunctionTypes[tree, file, context] _ FakeCopyContextForConditional[context] let DefFileCode[tree, context, usage] _ where code _ RopeCode2["%g: TYPE = {%g};\N", IdFill[Identifier], CodeFill[BuildNameSeqArgCode[FormNameList[IdList]]]] let ImplFileCode[tree, context, usage] _ ; for BaseItems.baseFcn: AbstractProduction[Identifier, ModIdList.args, ModIdList.results, DamageShareAssertions] let CollectModuleValueTypes[tree, file, context] _ FakeCopyContextForConditional[context] let CollectModuleFunctionTypes[tree, file, context] _ RecordBaseFcnDef[context, BuildName[Identifier], file, argTypes, resultTypes, fcnDefGraph] where argTypes _ FormTypeListEarly[ModIdList.args, context] where resultTypes _ FormTypeListEarly[ModIdList.results, context] where fcnDefGraph _ FormRecordOfDamageShareAssertion[DamageShareAssertions, fcnDefGraph1] where fcnDefGraph1 _ BuildFcnBaseGraph[argNames, resultNames] where argNames _ FormNameList[ModIdList.args] where resultNames _ FormNameList[ModIdList.results] let DefFileCode[tree, context, usage] _ where code _ RopeCode3["%g: PROC%g RETURNS[%g];\N\N", IdFill[Identifier], CodeFill[argsCode], CodeFill[resultsCode]] where argsCode _ if TestEmptyCode[argsCode1] then BuildEmptyCode[] else RopeCode1["[%g]", CodeFill[argsCode1]] where _ FormTypesCode[ModIdList.args, context, use1] where _ FormTypesCode[ModIdList.results, context, usage] let ImplFileCode[tree, context, usage] _ ; for BaseItems.treeRecFcn: AbstractProduction[Identifier, ModIdList.args, ModIdList.results, DamageShareAssertions] let CollectModuleValueTypes[tree, file, context] _ FakeCopyContextForConditional[context] let CollectModuleFunctionTypes[tree, file, context] _ RecordRecFcnDef[context, BuildName[Identifier], file, argTypes, resultTypes, fcnDefGraph] where check _ CheckForEqualTypeLists[ BuildOneTypeList[GetFirstType[argTypes]], BuildOneTypeList[FindType[context, BuildRopeName["Tree"]]]] where argTypes _ FormTypeListEarly[ModIdList.args, context] where resultTypes _ FormTypeListEarly[ModIdList.results, context] where procTypeName _ BuildRopeName[ConcatRopes2[RopeFromIdentifierNode[Identifier], "ProcType"]] where fcnDefGraph _ PrepareRecFcnDefGraph[fcnDefGraph2] where fcnDefGraph2 _ FormRecordOfDamageShareAssertion[DamageShareAssertions, fcnDefGraph1] where fcnDefGraph1 _ BuildFcnBaseGraph[argNames, resultNames] where argNames _ FormNameList[ModIdList.args] where resultNames _ FormNameList[ModIdList.results] let DefFileCode[tree, context, usage] _ where code _ RopeCode3["%gProcType: TYPE = PROC[%g] RETURNS[%g];\N\N", IdFill[Identifier], CodeFill[argCode], CodeFill[resultsCode]] where _ FormTypesCode[ModIdList.args, context, use1] where _ FormTypesCode[ModIdList.results, context, usage] let ImplFileCode[tree, context, usage] _ ; for AbGramItems.abType: AbstractProduction[Identifier, IdList] let CollectModuleValueTypes[tree, file, context] _ RecordAbstractType[context, name, file, codeName, IdList, nameList] where name _ BuildName[Identifier] where codeName _ RopeCode1["%gNode", IdFill[Identifier]] where nameList _ FormNameList[IdList] let CollectModuleFunctionTypes[tree, file, context] _ FakeCopyContextForConditional[context] let DefFileCode[tree, context, usage] _ where code _ ConcatCode5[ header, nodeCode, nodeBodyCode, nodeProcsCode, nodeProcsBodyCode] where header _ RopeCode1["\N--%g\N\N", IdFill[Identifier]] where nodeCode _ RopeCode2["%g: TYPE = REF %gBody;\N", CodeFill[nameCode], CodeFill[nameCode]] where nodeBodyCode _ ConcatCode4[ RopeCode1["%gBody: TYPE = RECORD[\N", CodeFill[nameCode]], RopeCode["\Tposition: INT, length: INT,\N"], RopeCode1["\Tprocs: %gProcs,\N", CodeFill[nameCode]], RopeCode["\Tdata: REF ANY];\N\N"]] where nodeProcsCode _ RopeCode2["%gProcs: TYPE = REF %gProcsBody;\N", CodeFill[nameCode], CodeFill[nameCode]] where nodeProcsBodyCode _ ConcatCode3[ RopeCode1["%gProcsBody: TYPE = RECORD[\N", CodeFill[nameCode]], typeCode, RopeCode["];\N\N"]] where _ ProcFieldTypeCode[IdList, context, usage] where nameCode _ GetTypeCodeName[LookUpType[context, name]] where name _ BuildName[Identifier] let ImplFileCode[tree, context, usage] _ ; for AbGramItems.abProd: AbstractProduction[ModId, ModIdList] let CollectModuleValueTypes[tree, file, context] _ RecordAbstractProduction[context, name, file, rightSideList, prodContext] where name _ FormName[ModId] where rightSideList _ FormNameList[ModIdList] where prodContext _ LockContext[FormAbstRightSideContext[ModIdList, BuildEmptyContext[]]] let CollectModuleFunctionTypes[tree, file, context] _ FakeCopyContextForConditional[context] let DefFileCode[tree, context, usage] _ where code _ ConcatCode5[ headerCode, dataTypeCode, procsCode, buildCode, code1] where use _ FormTypeUse[ModIdList, use1, context] where headerCode _ RopeCode1["\N-- %g\N\N", CodeFill[prodNameCode]] where dataTypeCode _ ConcatCode2[ RopeCode2["%gData: TYPE = REF %gDataBody;\N", CodeFill[prodNameCode], CodeFill[prodNameCode]], ConcatCode3[ RopeCode1["%gDataBody: TYPE = RECORD[\N", CodeFill[prodNameCode]], argNameCode, RopeCode["];\N\N"]]] where argNameCode _ BuildArgNameTypeCode[fieldNames, fieldTypes] where fieldNames _ FormNameList[ModIdList] where fieldTypes _ FormTypeList[ModIdList, context] where procsCode _ RopeCode2["%gProcs: %gProcs;\N\N", CodeFill[prodNameCode], CodeFill[typeNameCode]] where buildCode _ ConcatCode2[ RopeCode2["Build%gNode: PROC[position: INT, length: INT%g]\N", CodeFill[prodNameCode], CodeFill[DataBodyFieldTypeCode[ModIdList, context]]], RopeCode1["\TRETURNS[%g];\N\N", CodeFill[typeNameCode]]] where typeNameCode _ GetTypeCodeName[LookUpType[context, typeName]] where _ FormRecFcnsDeclCode[LookUpAbTypeRecFcnsIdList[context, typeName], prodNameCode, context, usage] where typeName _ BuildName[FormFirstId[ModId]] where prodNameCode _ RopeCode1["%gProd", NameFill[FormName[ModId]]] let ImplFileCode[tree, context, usage] _ where code _ ConcatCode3[ headerCode, procsImplCode, buildImplCode] where use _ FormTypeUse[ModIdList, use1, context] where headerCode _ RopeCode1["\N-- %g\N\N", CodeFill[prodNameCode]] where procsImplCode _ ConcatCode4[ RopeCode2["%gProcs: PUBLIC %gProcs _\N", CodeFill[prodNameCode], CodeFill[typeNameCode]], RopeCode1["\TNEW[%gProcsBody _ [", CodeFill[typeNameCode]], procsNamesCode, RopeCode["]];\N\N"]] where procsNamesCode _ FormProcsNamesCode[procNamesIdList, prodNameCode] where procNamesIdList _ LookUpAbTypeRecFcnsIdList[context, typeName] where buildImplCode _ ConcatCode6[ RopeCode2["Build%gNode: PUBLIC PROC[position: INT, length: INT%g]\N", CodeFill[prodNameCode], CodeFill[DataBodyFieldTypeCode[ModIdList, context]]], RopeCode1["\TRETURNS[%g] =\N", CodeFill[typeNameCode]], RopeCode["\T\TBEGIN\N"], dataRcdCode, RopeCode3["\T\TRETURN[NEW[%gBody_[position, length, %gProcs, %g]]];\N", CodeFill[typeNameCode], CodeFill[prodNameCode], CodeFill[dataRefCode]], RopeCode["\T\TEND;\N\N"]] where dataRcdCode _ if TestEmptyCode[nameSeqArgCode] then BuildEmptyCode[] else ConcatCode3[ RopeCode1["\T\Tdata: %gData _\N", CodeFill[prodNameCode]], RopeCode1["\T\T\TNEW[%gDataBody_[\N", CodeFill[prodNameCode]], RopeCode1["\T\T\T%g]];\N", CodeFill[nameSeqArgCode]]] where dataRefCode _ if TestEmptyCode[nameSeqArgCode] then RopeCode["NIL"] else RopeCode["data"] where nameSeqArgCode _ BuildNameSeqArgCode[FormNameList[ModIdList]] where typeNameCode _ GetTypeCodeName[LookUpType[context, typeName]] where use1 _ RecordAbstProdUse[use0, prodName, Use.export, context] where use0 _ RecordAbstProdUse[usage, prodName, Use.import, context] where typeName _ BuildName[FormFirstId[ModId]] where prodNameCode _ RopeCode1["%gProd", NameFill[prodName]] where prodName _ FormName[ModId]; for AbGramItems.abProdFcnImpl: AbstractProduction[AbProductionFcnImpl] let CollectModuleValueTypes[tree, file, context] _ FakeCopyContextForConditional[context] let CollectModuleFunctionTypes[tree, file, context] _ FakeCopyContextForConditional[context] let DefFileCode[tree, context, usage] _ let ImplFileCode[tree, context, usage] _ ImplFileCode[AbProductionFcnImpl, context, usage] End.