-- 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] _ let CollectRightSideSymbols[tree, context] _ FakeCopyContextForConditional[context] let DefFileCode[tree, context, usage] _ let ImplFileCode[tree, context, usage] _ let LinkFileCode[tree, context, usage] _ let SyntaxFileCodes[tree, context] _ 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] _ 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] _ let SyntaxFileCodes[tree, context] _ 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] _ 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] _ let SyntaxFileCodes[tree, context] _ 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] _ 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] _ let CollectRightSideSymbols[tree, context] _ FakeCopyContextForConditional[context] let DefFileCode[tree, context, usage] _ 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] _ 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] _ where code _ RopeCode2["tknLinkArray[%g] _ Build%gNode;\N", CodeFill[RopeCode[RopeFromRopeNode[Rope.tknName]]], IdFill[Identifier]] let SyntaxFileCodes[tree, context] _ 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] _ let CollectRightSideSymbols[tree, context] _ CollectRightSideSymbols[RopeList, context] let DefFileCode[tree, context, usage] _ let ImplFileCode[tree, context, usage] _ let LinkFileCode[tree, context, usage] _ let SyntaxFileCodes[tree, context] _ where tkn _ RopeCode1["{ %g }: SimpleTokens;\N", CodeFill[simples]] where _ 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] _ let CollectRightSideSymbols[tree, context] _ RecordNonTerminalToken[context, ntName, atName] where ntName _ BuildName[Identifier.name] where atName _ BuildName[Identifier.builds] let DefFileCode[tree, context, usage] _ let ImplFileCode[tree, context, usage] _ let LinkFileCode[tree, context, usage] _ let SyntaxFileCodes[tree, context] _ 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] _ 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.