-- ThreeC4RecFcnImplAbGram.ThreeC4 -- Sturgis, May 8, 1986 3:50:36 pm PDT Include[ThreeC4BaseDecl, ThreeC4RecFcnDecl, ThreeC4BasicAbTypes]; ThreeC4RecFcnImplAbGram: Module = Begin -- this module contains the abstract grammar for the recursive function implementations -- the following recursive functions are only used here ProdImplFileCode: TreeRecursiveFunction[Tree, LookupContext, Name.type, Name.prod, Usage.arg] Returns[MesaCode, Usage.result] DamagedReps[Usage.arg]; CompForArgs: TreeRecursiveFunction[Tree, TreeCallFlag, Integer.firstTemp, LookupContext, Usage.arg] Returns[MesaCode.varDecl, MesaCode.statement, MesaCode.arg, MesaCode.firstArg, TypeList, Integer.nextTemp, Usage.result] DamagedReps[Integer.firstTemp, Usage.arg]; CompForVars: TreeRecursiveFunction[Tree, NameList.temps, Integer.firstTemp, LookupContext, Usage.arg] Returns[MesaCode.varDecl, MesaCode.statement, TypeList, NameList.tempsRemaining, Integer.nextTemp, Usage.result] DamagedReps[Integer.firstTemp, Usage.arg] SharedReps[NameList.temps, NameList.tempsRemaining]; CountVals: TreeRecursiveFunction[Tree, LookupContext] Returns[Integer]; CompWhere: TreeRecursiveFunction[Tree, Integer.firstTemp, LookupContext.arg, Usage.arg] Returns[MesaCode.varDecl, MesaCode.statement, Integer.nextTemp, LookupContext.result, Usage.result] SharedReps[LookupContext.arg, LookupContext.result] DamagedReps[Integer.firstTemp, Usage.arg]; -- the following base types and recursive functions involved in flow analysis are used only here FcnImplGraph: BaseType; SlotList: BaseType; CallGraphNode: BaseType; BuildFcnImplGraph: BaseFunction[LookupContext, Identifier, NameList] Returns[FcnImplGraph]; FakeCopyFcnImplGraph: BaseFunction[FcnImplGraph.arg] Returns[FcnImplGraph.result] DamagedReps[FcnImplGraph.arg]; RecordCall: BaseFunction[FcnImplGraph.arg, LookupContext, Identifier, SlotList.arg, CallGraphNode.arg] Returns[FcnImplGraph.result, SlotList.result, CallGraphNode.build] DamagedReps[FcnImplGraph.arg]; RecordAssignment: BaseFunction[FcnImplGraph.arg, NameList, SlotList, CallGraphNode.arg] Returns[FcnImplGraph.result, CallGraphNode.built] DamagedReps[FcnImplGraph.arg]; RecordSequential: BaseFunction[FcnImplGraph.arg, CallGraphNode.arg1, CallGraphNode.arg2] Returns[FcnImplGraph.result, CallGraphNode.built] DamagedReps[FcnImplGraph.arg]; RecordParallel: BaseFunction[FcnImplGraph.arg, CallGraphNode.arg1, CallGraphNode.arg2] Returns[FcnImplGraph.result, CallGraphNode.built] DamagedReps[FcnImplGraph.arg]; RecordCondition: BaseFunction[FcnImplGraph.arg, SlotList.arg1, CallGraphNode.arg1, SlotList.arg2, CallGraphNode.arg2, SlotList.arg3, CallGraphNode.arg3] Returns[FcnImplGraph.result, SlotList.combined, CallGraphNode.built] DamagedReps[FcnImplGraph.arg]; RecordSimpleVarUse: BaseFunction[FcnImplGraph.arg, LookupContext, Identifier] Returns[FcnImplGraph.result, SlotList, CallGraphNode] DamagedReps[FcnImplGraph.arg]; RecordModIdUse: BaseFunction[FcnImplGraph.arg, LookupContext, Identifier.a, Identifier.b] Returns[FcnImplGraph.result, SlotList, CallGraphNode] DamagedReps[FcnImplGraph.arg]; RecordLiteralUse: BaseFunction[FcnImplGraph.arg, INT] Returns[FcnImplGraph.result, SlotList, CallGraphNode] DamagedReps[FcnImplGraph.arg]; OpenWithWhereList: BaseFunction[FcnImplGraph.arg] Returns[FcnImplGraph.result] DamagedReps[FcnImplGraph.arg]; CloseWithWhereList: BaseFunction[FcnImplGraph.arg] Returns[FcnImplGraph.result] DamagedReps[FcnImplGraph.arg]; CheckFcnImpl: BaseFunction[LookupContext, FcnImplGraph.arg, SlotList, CallGraphNode] Returns[BOOLEAN] DamagedReps[FcnImplGraph.arg]; ConcatSlotList: BaseFunction[SlotList.arg1, SlotList.arg2] Returns[SlotList.result] DamagedReps[SlotList.arg1] SharedReps[SlotList.arg2, SlotList.result]; BuildEmptySlotList: BaseFunction Returns[SlotList]; BuildEmptyCallGraphNode: BaseFunction Returns[CallGraphNode]; FormFcnImplGraph: TreeRecursiveFunction[Tree, LookupContext, FcnImplGraph.arg] Returns[FcnImplGraph.result, SlotList, CallGraphNode] DamagedReps[FcnImplGraph.arg]; FormFcnImplWhereGraph: TreeRecursiveFunction[Tree, LookupContext, FcnImplGraph.arg] Returns[FcnImplGraph.result, CallGraphNode] DamagedReps[FcnImplGraph.arg]; -- AbProductionFcnImpl is declared in BasicAbTypes AbProductionFcnImpl: AbstractProduction[ModId, ModIdList, RecFcnImplList]; RecFcnImplList: AbstractType[ProdImplFileCode]; RecFcnImplList.one: AbstractProduction[Identifier, IdList, RecExpression]; RecFcnImplList.many: AbstractProduction[RecFcnImplList.a, RecFcnImplList.b]; RecExpression: AbstractType[CompForArgs, CompForVars, CountVals, FormFcnImplGraph]; RecExpression.withWhereList: AbstractProduction[RecExpression, WhereExpSeq]; RecExpression.cond: AbstractProduction[ RecExpression.ifClause, RecExpression.thenClause, RecExpression.elseClause]; RecExpression.call: AbstractProduction[Identifier, RecExpSeq]; RecExpression.seq: AbstractProduction[RecExpSeq]; RecExpression.id: AbstractProduction[Identifier]; RecExpression.modId: AbstractProduction[Identifier.a, Identifier.b]; RecExpression.rope: AbstractProduction[Rope]; RecExpression.numb: AbstractProduction[NonNegInteger]; RecExpression.sourcePosition: AbstractProduction[ModId]; RecExpression.sourceLength: AbstractProduction[ModId]; RecExpSeq: AbstractType[CompForArgs, CompForVars, CountVals, FormFcnImplGraph]; RecExpSeq.empty: AbstractProduction[]; RecExpSeq.one: AbstractProduction[RecExpression]; RecExpSeq.many: AbstractProduction[RecExpSeq.a, RecExpSeq.b]; -- concrete grammar guarantees both non empty WhereExpSeq: AbstractType[CompWhere, FormFcnImplWhereGraph]; WhereExpSeq.one: AbstractProduction[IdList, RecExpression]; WhereExpSeq.many: AbstractProduction[WhereExpSeq.a, WhereExpSeq.b] End. J.Nq