-- ThreeC4ModItemImpl.ThreeC4 -- Sturgis, May 9, 1986 5:17:42 pm PDT -- this module contains the implementation code for ModItemAbGram Include[ThreeC4BaseDecl, ThreeC4RecFcnDecl, ThreeC4BasicAbTypes, ThreeC4ModItemAbGram]; ThreeC4ModItemImpl: Module = Begin for ModuleItem.cedarItems: AbstractProduction[CedarItems] let CollectModuleValueTypes[tree, defFileName, context] ← CollectModuleValueTypes[CedarItems, defFileName, context] let CollectModuleFunctionTypes[tree, defFileName, context] ← CollectModuleFunctionTypes[CedarItems, defFileName, context] let CollectProductions[tree, first, context] ← <FakeCopyInt[first], FakeCopyContextForConditional[context]> let CollectRightSideSymbols[tree, context] ← FakeCopyContextForConditional[context] let DefFileCode[tree, context, usage] ← <BuildEmptyCode[], FakeUsageCopy[usage]> let ImplFileCode[tree, context, usage] ← <BuildEmptyCode[], FakeUsageCopy[usage]> let LinkFileCode[tree, context, usage] ← <BuildEmptyCode[], FakeUsageCopy[usage]> let SyntaxFileCodes[tree, context] ← <BuildEmptyCode[], BuildEmptyCode[]> let TestLinkPresent[tree] ← EqualRopes["True", "False"]; for ModuleItem.baseItems: AbstractProduction[BaseItems] let CollectModuleValueTypes[tree, defFileName, context] ← CollectModuleValueTypes[BaseItems, defFileName, context] let CollectModuleFunctionTypes[tree, defFileName, context] ← CollectModuleFunctionTypes[BaseItems, defFileName, context] let CollectProductions[tree, first, context] ← <FakeCopyInt[first], FakeCopyContextForConditional[context]> let CollectRightSideSymbols[tree, context] ← FakeCopyContextForConditional[context] let DefFileCode[tree, context, usage] ← DefFileCode[BaseItems, context, usage] let ImplFileCode[tree, context, usage] ← ImplFileCode[BaseItems, context, usage] let LinkFileCode[tree, context, usage] ← <BuildEmptyCode[], FakeUsageCopy[usage]> let SyntaxFileCodes[tree, context] ← <BuildEmptyCode[], BuildEmptyCode[]> let TestLinkPresent[tree] ← EqualRopes["True", "False"]; for ModuleItem.abGramItems: AbstractProduction[AbGramItems] let CollectModuleValueTypes[tree, defFileName, context] ← CollectModuleValueTypes[AbGramItems, defFileName, context] let CollectModuleFunctionTypes[tree, defFileName, context] ← CollectModuleFunctionTypes[AbGramItems, defFileName, context] let CollectProductions[tree, first, context] ← <FakeCopyInt[first], FakeCopyContextForConditional[context]> let CollectRightSideSymbols[tree, context] ← FakeCopyContextForConditional[context] let DefFileCode[tree, context, usage] ← DefFileCode[AbGramItems, context, usage] let ImplFileCode[tree, context, usage] ← ImplFileCode[AbGramItems, context, usage] let LinkFileCode[tree, context, usage] ← <BuildEmptyCode[], FakeUsageCopy[usage]> let SyntaxFileCodes[tree, context] ← <BuildEmptyCode[], BuildEmptyCode[]> let TestLinkPresent[tree] ← EqualRopes["True", "False"]; for ModuleItem.cGramItems: AbstractProduction[CGramItems] let CollectModuleValueTypes[tree, defFileName, context] ← FakeCopyContextForConditional[context] let CollectModuleFunctionTypes[tree, defFileName, context] ← FakeCopyContextForConditional[context] let CollectProductions[tree, first, context] ← CollectProductions[CGramItems, first, context] let CollectRightSideSymbols[tree, context] ← CollectRightSideSymbols[CGramItems, context] let DefFileCode[tree, context, usage] ← <BuildEmptyCode[], FakeUsageCopy[usage]> let ImplFileCode[tree, context, usage] ← ImplFileCode[CGramItems, context, usage] let LinkFileCode[tree, context, usage] ← LinkFileCode[CGramItems, context, usage] let SyntaxFileCodes[tree, context] ← SyntaxFileCodes[CGramItems, context] let TestLinkPresent[tree] ← TestLinkPresent[CGramItems]; for ModuleItem.genTkn: AbstractProduction[Identifier, Rope.tknName] let CollectModuleValueTypes[tree, file, context] ← RecordGenericToken[context, name, file, codeName] where name ← BuildName[Identifier] where codeName ← RopeCode1["%gNode", IdFill[Identifier]] let CollectModuleFunctionTypes[tree, file, context] ← FakeCopyContextForConditional[context] let CollectProductions[tree, first, context] ← <FakeCopyInt[first], FakeCopyContextForConditional[context]> let CollectRightSideSymbols[tree, context] ← FakeCopyContextForConditional[context] let DefFileCode[tree, context, usage] ← <code, use2> where code ← ConcatCode3[ headerCode, nodeCode, nodeBodyCode] where use2 ← RecordTypeUse[use1, LookUpType[context, BuildRopeName["INT"]]] where use1 ← RecordTypeUse[usage, LookUpType[context, BuildRopeName["ROPE"]]] where headerCode ← RopeCode1["\N--%g\N\N", IdFill[Identifier]] where nodeCode ← RopeCode2["%g: TYPE = REF %gBody;\N", CodeFill[codeName], CodeFill[codeName]] where nodeBodyCode ← ConcatCode3[ RopeCode1["%gBody: TYPE = RECORD[\N", CodeFill[codeName]], RopeCode["\Ttext: Rope.ROPE,\N"], RopeCode["\Tposition, length: INT];\N\N"]] where codeName ← GetTypeCodeName[LookUpType[context, name]] where name ← BuildName[Identifier] let ImplFileCode[tree, context, usage] ← <code, use5> where code ← ConcatCode2[ headerCode, buildImplCode] where use5 ← RecordDefFileUse[use4, "Rope", Use.import] where use4 ← RecordTypeUse[use3, LookUpType[context, BuildRopeName["INT"]]] where use3 ← RecordTypeUse[use2, LookUpType[context, BuildRopeName["ROPE"]]] where headerCode ← RopeCode1["\N--%g\N\N", IdFill[Identifier]] where buildImplCode ← ConcatCode2[ RopeCode2["Build%g: PUBLIC PROC[text: Rope.ROPE, firstCharPosition: INT] RETURNS[%g] =\N", CodeFill[nameCode], CodeFill[nameCode]], RopeCode1["\T{RETURN[NEW[%gBody←[text, firstCharPosition, Length[text]]]]};\N\N", CodeFill[nameCode]]] where nameCode ← GetTypeCodeName[LookUpType[context, name]] where use2 ← RecordGenericTokenUse[use1, name, Use.ref, context] where use1 ← RecordGenericTokenUse[usage, name, Use.export, context] where name ← BuildName[Identifier] let LinkFileCode[tree, context, usage] ← <code, FakeUsageCopy[usage]> where code ← RopeCode2["tknLinkArray[%g] ← Build%gNode;\N", CodeFill[RopeCode[RopeFromRopeNode[Rope.tknName]]], IdFill[Identifier]] let SyntaxFileCodes[tree, context] ← <tkn, prod> where tkn ← RopeCode2["%g: GenericToken = \"%g\" ;\N", IdFill[Identifier], CodeFill[RopeCode[RopeFromRopeNode[Rope.tknName]]]] where prod ← BuildEmptyCode[] let TestLinkPresent[tree] ← EqualRopes["True", "True"]; for CedarItems.cedarTypes: AbstractProduction[IdList] let CollectModuleValueTypes[tree, defFileName, context] ← RecordCedarTypes[IdList, context] let CollectModuleFunctionTypes[tree, defFileName, context] ← FakeCopyContextForConditional[context]; for CedarItems.cedarTypesFrom: AbstractProduction[IdList, Identifier] let CollectModuleValueTypes[tree, defFileName, context] ← RecordCedarTypesFrom[IdList, file, context] where file ← RopeFromIdentifierNode[Identifier] let CollectModuleFunctionTypes[tree, defFileName, context] ← FakeCopyContextForConditional[context]; for CedarItems.cedarEnumTypeFrom: AbstractProduction[Identifier.typeName, IdList.values, Identifier.fileName] let CollectModuleValueTypes[tree, defFileName, context] ← RecordEnumeratedBaseType[context, name, file, names, codeName] where name ← BuildName[Identifier.typeName] where names ← FormNameList[IdList.values] where file ← RopeFromIdentifierNode[Identifier.fileName] where codeName ← RopeCode1["%g", IdFill[Identifier.typeName]] let CollectModuleFunctionTypes[tree, defFileName, context] ← FakeCopyContextForConditional[context]; for CedarItems.cedarFunctionFrom: AbstractProduction[Identifier.funName, ModIdList.args, ModIdList.results, Identifier.fileName, DamageShareAssertions] let CollectModuleValueTypes[tree, defFileName, context] ← FakeCopyContextForConditional[context] let CollectModuleFunctionTypes[tree, defFileName, context] ← RecordBaseFunction[context, BuildName[Identifier.funName], defFileName, argTypes, resultTypes, fcnDefGraph] where argTypes ← FormTypeListEarly[ModIdList.args, context] where resultTypes ← FormTypeListEarly[ModIdList.results, context] where defFileName ← RopeFromIdentifierNode[Identifier.fileName] where fcnDefGraph ← FormRecordOfDamageShareAssertion[DamageShareAssertions, fcnDefGraph1] where fcnDefGraph1 ← BuildFcnBaseGraph[argNames, resultNames] where argNames ← FormNameList[ModIdList.args] where resultNames ← FormNameList[ModIdList.results]; for CGramItems.simpleTokens: AbstractProduction[RopeList] let CollectProductions[tree, first, context] ← <FakeCopyInt[first], FakeCopyContextForConditional[context]> let CollectRightSideSymbols[tree, context] ← CollectRightSideSymbols[RopeList, context] let DefFileCode[tree, context, usage] ← <BuildEmptyCode[], FakeUsageCopy[usage]> let ImplFileCode[tree, context, usage] ← <BuildEmptyCode[], FakeUsageCopy[usage]> let LinkFileCode[tree, context, usage] ← <BuildEmptyCode[], FakeUsageCopy[usage]> let SyntaxFileCodes[tree, context] ← <tkn, prod> where tkn ← RopeCode1["{ %g }: SimpleTokens;\N", CodeFill[simples]] where <simples, unused> ← SyntaxFileCodes[RopeList, context] where prod ← BuildEmptyCode[] let TestLinkPresent[tree] ← EqualRopes["True", "False"]; for CGramItems.nonTerminal: AbstractProduction[Identifier.name, Identifier.builds] let CollectProductions[tree, first, context] ← <FakeCopyInt[first], FakeCopyContextForConditional[context]> let CollectRightSideSymbols[tree, context] ← RecordNonTerminalToken[context, ntName, atName] where ntName ← BuildName[Identifier.name] where atName ← BuildName[Identifier.builds] let DefFileCode[tree, context, usage] ← <BuildEmptyCode[], FakeUsageCopy[usage]> let ImplFileCode[tree, context, usage] ← <BuildEmptyCode[], FakeUsageCopy[usage]> let LinkFileCode[tree, context, usage] ← <BuildEmptyCode[], FakeUsageCopy[usage]> let SyntaxFileCodes[tree, context] ← <tkn, prod> where tkn ← RopeCode1["%g: NonTerminal;\N", IdFill[Identifier.name]] where prod ← BuildEmptyCode[] let TestLinkPresent[tree] ← EqualRopes["True", "False"]; for CGramItems.concreteProduction: AbstractProduction[ConcreteProduction] let CollectProductions[tree, first, context] ← CollectProductions[ConcreteProduction, first, context] let CollectRightSideSymbols[tree, context] ← FakeCopyContextForConditional[context] let DefFileCode[tree, context, usage] ← <BuildEmptyCode[], FakeUsageCopy[usage]> let ImplFileCode[tree, context, usage] ← ImplFileCode[ConcreteProduction, context, usage] let LinkFileCode[tree, context, usage] ← LinkFileCode[ConcreteProduction, context, usage] let SyntaxFileCodes[tree, context] ← SyntaxFileCodes[ConcreteProduction, context] let TestLinkPresent[tree] ← EqualRopes["True", "True"] End.