-- ThreeC4BaseDecl.ThreeC4
-- Sturgis, May 8, 1986 3:48:11 pm PDT
ThreeC4BaseDecl1: Module =
Begin
-- we begin with the simple stuff
Identifier: GenericToken = "tokenID";
Rope: GenericToken = "tokenROPE";
NonNegInteger: GenericToken = "tokenDECIMAL";
ROPE: CedarType From Rope;
INT, BOOLEAN: CedarType;
Integer: BaseType;
TreeCallFlag: EnumeratedBaseType = {yes, no};
ConcatRopes2: BaseFunction[ROPE.arg1, ROPE.arg2] Returns[ROPE.result];
EqualRopes: BaseFunction[ROPE.arg1, ROPE.arg2] Returns[BOOLEAN];
RopeFromRopeNode: BaseFunction[Rope] Returns[ROPE];
RopeFromNonNegIntegerNode: BaseFunction[NonNegInteger] Returns[ROPE];
RopeFromIdentifierNode: BaseFunction[Identifier] Returns[ROPE];
IntegerFromRope: BaseFunction[ROPE] Returns[Integer];
Add1: BaseFunction[Integer.arg] Returns[Integer.result];
Add1ToInt: BaseFunction[INT.arg] Returns[INT.result];
Add: BaseFunction[Integer.arg1, Integer.arg2] Returns[Integer.sum];
FakeCopyInt: BaseFunction[INT.arg] Returns[INT.result];
Check: BaseFunction[BOOLEAN.a] Returns[BOOLEAN.r];
Not: BaseFunction[BOOLEAN.a] Returns[BOOLEAN.r];
AndLogical: BaseFunction[BOOLEAN.a, BOOLEAN.b] Returns[BOOLEAN.r];
-- AndLogical is a base function because And is exported both from Tran1Def3 and from Tran1PrimImplDefs, which leads to confusion
Or: BaseFunction[BOOLEAN.a, BOOLEAN.b] Returns[BOOLEAN.r];
FakeCopyInteger: BaseFunction[Integer.arg] Returns[Integer.result]
DamagedReps[Integer.arg];
EqualInteger: BaseFunction[Integer.a, Integer.b] Returns[BOOLEAN.r];
EqualTreeCallFlags: BaseFunction[TreeCallFlag.a, TreeCallFlag.b] Returns[BOOLEAN];
-- Names
Name: BaseType;
BuildName: BaseFunction[Identifier] Returns[Name];
BuildName2: BaseFunction[Identifier.root, Identifier.mod] Returns[Name];
BuildRopeName: BaseFunction[ROPE] Returns[Name];
-- Name lists
NameList: BaseType;
BuildEmptyNameList: BaseFunction Returns[NameList];
FakeCopyNameList: BaseFunction[NameList.arg] Returns[NameList.result]
DamagedReps[NameList.arg];
BuildOneNameList: BaseFunction[Name] Returns[NameList];
ConcatNameLists: BaseFunction[NameList.first, NameList.second] Returns[NameList.result]
DamagedReps[NameList.first] SharedReps[NameList.second, NameList.result];
AppendToNameList: BaseFunction[NameList.arg, Name] Returns[NameList.result]
DamagedReps[NameList.arg];
PrefixToNameList: BaseFunction[Name, NameList.arg] Returns[NameList.result]
SharedReps[Name, NameList.arg, NameList.result];
InventTemps: BaseFunction[Integer.nTemps, Integer.firstTempX]
Returns[NameList, Integer.nextTempX];
CompareNameLists: BaseFunction[NameList.a, NameList.b] Returns[BOOLEAN];
PartitionFirstName: BaseFunction[NameList.arg] Returns[Name, NameList.result]
SharedReps[NameList.arg, NameList.result];
PartitionNames: BaseFunction[Integer, NameList.arg]
Returns[NameList.result1, NameList.result2]
SharedReps[NameList.arg, NameList.result1, NameList.result2];
TheOneName: BaseFunction[NameList] Returns[Name];
TestEmptyNameList: BaseFunction[NameList] Returns[BOOLEAN];
-- Types
Type: BaseType;
GetTypeCodeName: BaseFunction[Type] Returns[MesaCode];
CompareValTypeWithVarType: BaseFunction[Type.val, Type.var] Returns[BOOLEAN];
FoundType: BaseFunction[Type] Returns[BOOLEAN];
-- Type lists
TypeList: BaseType;
BuildEmptyTypeList: BaseFunction Returns[TypeList];
BuildOneTypeList: BaseFunction[Type] Returns[TypeList];
AppendToTypeList: BaseFunction[TypeList.arg, Type] Returns[TypeList.result]
DamagedReps[TypeList.arg];
PrefixToTypeList: BaseFunction[Type, TypeList.arg] Returns[TypeList.result]
SharedReps[TypeList.arg, TypeList.result];
ConcatTypeLists: BaseFunction[TypeList.arg1, TypeList.arg2] Returns[TypeList.result]
DamagedReps[TypeList.arg1]
SharedReps[TypeList.arg2, TypeList.result];
CompareValTypesWithVarTypes: BaseFunction[TypeList.val, TypeList.var]
Returns[BOOLEAN];
GetTheOneType: BaseFunction[TypeList] Returns[Type];
GetFirstType: BaseFunction[TypeList] Returns[Type];
PartitionLastType: BaseFunction[TypeList.arg] Returns[TypeList.result, Type]
SharedReps[TypeList.arg, TypeList.result];
PartitionFirstType: BaseFunction[TypeList.arg] Returns[Type, TypeList.result]
SharedReps[TypeList.arg, TypeList.result];
CountTypes: BaseFunction[TypeList] Returns[Integer];
CheckForOneBoolean: BaseFunction[TypeList] Returns[BOOLEAN];
CheckForEqualTypeLists: BaseFunction[TypeList.arg1, TypeList.arg2] Returns[BOOLEAN];
-- generated code
MesaCode: BaseType;
CodeFiller: BaseType;
BuildEmptyCode: BaseFunction Returns[MesaCode];
BuildErrorCode: BaseFunction[ROPE] Returns[MesaCode];
TestEmptyCode: BaseFunction[MesaCode] Returns[BOOLEAN];
FakeCopyCodeForConditional: BaseFunction[MesaCode.arg] Returns[MesaCode.result]
DamagedReps[MesaCode.arg];
RopeCode: BaseFunction[ROPE] Returns[MesaCode];
RopeCode1: BaseFunction[ROPE, CodeFiller] Returns[MesaCode];
RopeCode2: BaseFunction[ROPE, CodeFiller.a, CodeFiller.b] Returns[MesaCode];
RopeCode3: BaseFunction[ROPE, CodeFiller.a, CodeFiller.b, CodeFiller.c] Returns[MesaCode];
RopeCode4: BaseFunction[ROPE, CodeFiller.a, CodeFiller.b, CodeFiller.c, CodeFiller.d]
Returns[MesaCode];
ConcatCode2: BaseFunction[MesaCode.arg1, MesaCode.arg2] Returns[MesaCode.result]
DamagedReps[MesaCode.arg1, MesaCode.arg2];
ConcatCode3: BaseFunction[MesaCode.arg1, MesaCode.arg2, MesaCode.arg3]
Returns[MesaCode.result]
DamagedReps[MesaCode.arg1, MesaCode.arg2, MesaCode.arg3];
ConcatCode4: BaseFunction[MesaCode.arg1, MesaCode.arg2, MesaCode.arg3, MesaCode.arg4]
Returns[MesaCode.result]
DamagedReps[MesaCode.arg1, MesaCode.arg2, MesaCode.arg3, MesaCode.arg4];
ConcatCode5: BaseFunction[MesaCode.arg1, MesaCode.arg2, MesaCode.arg3, MesaCode.arg4,
MesaCode.arg5] Returns[MesaCode.result]
DamagedReps[MesaCode.arg1, MesaCode.arg2, MesaCode.arg3, MesaCode.arg4]
DamagedReps[MesaCode.arg5];
ConcatCode6: BaseFunction[MesaCode.arg1, MesaCode.arg2, MesaCode.arg3, MesaCode.arg4,
MesaCode.arg5, MesaCode.arg6] Returns[MesaCode.result]
DamagedReps[MesaCode.arg1, MesaCode.arg2, MesaCode.arg3, MesaCode.arg4]
DamagedReps[MesaCode.arg5, MesaCode.arg6];
ConcatCode7: BaseFunction[MesaCode.arg1, MesaCode.arg2, MesaCode.arg3, MesaCode.arg4,
MesaCode.arg5, MesaCode.arg6, MesaCode.arg7]
Returns[MesaCode.result]
DamagedReps[MesaCode.arg1, MesaCode.arg2, MesaCode.arg3, MesaCode.arg4]
DamagedReps[MesaCode.arg5, MesaCode.arg6, MesaCode.arg7];
ConcatCode8: BaseFunction[MesaCode.arg1, MesaCode.arg2, MesaCode.arg3, MesaCode.arg4,
MesaCode.arg5, MesaCode.arg6, MesaCode.arg7, MesaCode.arg8]
Returns[MesaCode.result]
DamagedReps[MesaCode.arg1, MesaCode.arg2, MesaCode.arg3, MesaCode.arg4]
DamagedReps[MesaCode.arg5, MesaCode.arg6, MesaCode.arg7, MesaCode.arg8];
ConcatCode9: BaseFunction[MesaCode.arg1, MesaCode.arg2, MesaCode.arg3, MesaCode.arg4,
MesaCode.arg5, MesaCode.arg6, MesaCode.arg7, MesaCode.arg8,
MesaCode.arg9] Returns[MesaCode.result]
DamagedReps[MesaCode.arg1, MesaCode.arg2, MesaCode.arg3, MesaCode.arg4]
DamagedReps[MesaCode.arg5, MesaCode.arg6, MesaCode.arg7, MesaCode.arg8]
DamagedReps[MesaCode.arg9];
-- following used for the functions that return pairs of mesa code
ConcatCodePairs2: BaseFunction[MesaCode.a1, MesaCode.a2, MesaCode.b1, MesaCode.b2]
Returns[MesaCode.r1, MesaCode.r2]
DamagedReps[MesaCode.a1, MesaCode.a2, MesaCode.b1, MesaCode.b2];
IdFill: BaseFunction[Identifier] Returns[CodeFiller];
IdFill2: BaseFunction[Identifier.root, Identifier.mod] Returns[CodeFiller];
CodeFill: BaseFunction[MesaCode] Returns[CodeFiller];
NameFill: BaseFunction[Name] Returns[CodeFiller];
IntegerFill: BaseFunction[Integer] Returns[CodeFiller];
IntFill: BaseFunction[INT] Returns[CodeFiller];
BuildNameSeqArgCode: BaseFunction[NameList] Returns[MesaCode];
BuildResultTypeCode: BaseFunction[TypeList] Returns[MesaCode];
BuildArgNameTypeCode: BaseFunction[NameList, TypeList] Returns[MesaCode];
BuildVarDeclCode: BaseFunction[NameList, TypeList] Returns[MesaCode];
-- file sequences
FileSeq: BaseType;
BuildEmptyFileSeq: BaseFunction Returns[FileSeq];
BuildOneFileSeq: BaseFunction[MesaCode.name, MesaCode.body] Returns[FileSeq];
AppendToFileSeq: BaseFunction[FileSeq.arg, MesaCode.name, MesaCode.body]
Returns[FileSeq.result]
DamagedReps[FileSeq.arg];
ConcatFileSeq: BaseFunction[FileSeq.arg1, FileSeq.arg2] Returns[FileSeq.result]
DamagedReps[FileSeq.arg1, FileSeq.arg2];
FakeCopyFileSeqForConditional: BaseFunction[FileSeq.arg] Returns[FileSeq.result]
DamagedReps[FileSeq.arg]
End;
ThreeC4BaseDecl2: Module =
Begin
-- some flow analysis stuff
FcnDefGraph: BaseType;
BuildFcnBaseGraph: BaseFunction[NameList.args, NameList.results] Returns[FcnDefGraph];
FakeCopyFcnBaseGraph: BaseFunction[FcnDefGraph.arg] Returns[FcnDefGraph.result]
DamagedReps[FcnDefGraph.arg];
RecordShareList: BaseFunction[FcnDefGraph.arg, NameList] Returns[FcnDefGraph.result]
DamagedReps[FcnDefGraph.arg];
RecordDamageList: BaseFunction[FcnDefGraph.arg, NameList] Returns[FcnDefGraph.result]
DamagedReps[FcnDefGraph.arg];
PrepareRecFcnDefGraph: BaseFunction[FcnDefGraph.arg] Returns[FcnDefGraph.result]
DamagedReps[FcnDefGraph.arg];
-- contexts
Context: BaseType;
BuildEmptyContext: BaseFunction Returns[Context];
FakeCopyContextForConditional: BaseFunction[Context.arg] Returns[Context.result]
DamagedReps[Context.arg];
RecordGlobalTreeType: BaseFunction[Context.arg, Name, MesaCode] Returns[Context.result]
DamagedReps[Context.arg];
RecordSimpleBaseType: BaseFunction[Context.arg, Name, ROPE, MesaCode]
Returns[Context.result]
DamagedReps[Context.arg];
RecordEnumeratedBaseType: BaseFunction[Context.arg, Name, ROPE, NameList, MesaCode]
Returns[Context.result]
DamagedReps[Context.arg]
SharedReps[NameList, Context.result];
RecordCedarType: BaseFunction[Context.arg, Name, ROPE, MesaCode] Returns[Context.result]
DamagedReps[Context.arg];
RecordPreDefinedCedarType: BaseFunction[Context.arg, Name, MesaCode]
Returns[Context.result]
DamagedReps[Context.arg];
RecordBaseFunction: BaseFunction[Context.arg, Name, ROPE, TypeList.args, TypeList.results, FcnDefGraph.g]
Returns[Context.result]
DamagedReps[Context.arg]
SharedReps[TypeList.args, TypeList.results, FcnDefGraph.g, Context.result];
RecordBaseFcnDef: BaseFunction[Context.arg, Name, ROPE, TypeList.args, TypeList.results, FcnDefGraph]
Returns[Context.result]
DamagedReps[Context.arg]
SharedReps[TypeList.args, TypeList.results, FcnDefGraph, Context.result];
RecordRecFcnDef: BaseFunction[Context.arg, Name, ROPE, TypeList.args, TypeList.results, FcnDefGraph]
Returns[Context.result]
DamagedReps[Context.arg]
SharedReps[TypeList.args, TypeList.results, FcnDefGraph, Context.result];
RecordRopeToken: BaseFunction[Context.arg, Rope] Returns[Context.result]
DamagedReps[Context.arg];
RecordNonTerminalToken: BaseFunction[Context.arg, Name.nonTerm, Name.builds]
Returns[Context.result]
DamagedReps[Context.arg];
RecordProduction: BaseFunction[Context.arg, Name, INT] Returns[Context.result]
DamagedReps[Context.arg];
RecordGenericToken: BaseFunction[Context.arg, Name, ROPE, MesaCode]
Returns[Context.result]
DamagedReps[Context.arg];
RecordAbstractProduction: BaseFunction[Context.arg, Name, ROPE, NameList, Context.prod]
Returns[Context.result]
DamagedReps[Context.arg]
SharedReps[NameList, Context.result];
RecordAbstRightSideSymbol: BaseFunction[Context.arg, Name.name, Name.type]
Returns[Context.result]
DamagedReps[Context.arg];
RecordControlModule: BaseFunction[Context.arg, ROPE] Returns[Context.result]
DamagedReps[Context.arg];
FindType: BaseFunction[Context, Name] Returns[Type];
-- Lookup contexts
LookupContext: BaseType;
FunctionCase: EnumeratedBaseType = {base, recursive};
BuildBasicLookupContext: BaseFunction[Context] Returns[LookupContext]
SharedReps[Context, LookupContext];
FakeCopyLookupContext: BaseFunction[LookupContext.arg] Returns[LookupContext.result]
DamagedReps[LookupContext.arg];
PushProductionContext: BaseFunction[LookupContext.arg, Context]
Returns[LookupContext.result]
SharedReps[LookupContext.arg, Context, LookupContext.result];
RecordVarSeq: BaseFunction[LookupContext.arg, NameList, TypeList]
Returns[LookupContext.result]
SharedReps[LookupContext.arg, LookupContext.result];
PushLocalRSS: BaseFunction[LookupContext.arg, Name, Type] Returns[LookupContext.result]
SharedReps[LookupContext.arg, LookupContext.result];
LookUpType: BaseFunction[LookupContext, Name] Returns[Type];
LookUpFunction: BaseFunction[LookupContext, Name]
Returns[FunctionCase, TypeList.args, TypeList.results]
SharedReps[LookupContext, TypeList.args];
LookUpRecFcnDef: BaseFunction[LookupContext, Name]
Returns[TypeList.args, TypeList.results]
SharedReps[LookupContext, TypeList.args];
LookUpFcnDefGraph: BaseFunction[LookupContext, Name] Returns[FcnDefGraph]
SharedReps[LookupContext, FcnDefGraph];
LookUpAbProduction: BaseFunction[LookupContext, Name] Returns[NameList, Context]
SharedReps[LookupContext, NameList, Context];
LookUpSimpleValue: BaseFunction[LookupContext, Identifier] Returns[Type, MesaCode];
LookUpValue2: BaseFunction[LookupContext, Identifier.id1, Identifier.id2]
Returns[Type, MesaCode];
EqualFunCase: BaseFunction[FunctionCase.a, FunctionCase.b] Returns[BOOLEAN];
CheckLegalRopeToken: BaseFunction[LookupContext, Rope] Returns[BOOLEAN];
LookUpGrammarSymbol: BaseFunction[LookupContext, Name] Returns[Type];
LookUpProduction: BaseFunction[LookupContext, Name] Returns[INT];
LookUpAbstractProduction: BaseFunction[LookupContext, Name] Returns[Type, TypeList];
LookUpRightSideSymbol: BaseFunction[LookupContext, Name] Returns[Type];
EmptyRSContext: BaseFunction[LookupContext] Returns[BOOLEAN];
LookUpEnumTypeVal: BaseFunction[LookupContext, Name.id1, Name.id2]
Returns[Type, MesaCode];
Usage: BaseType;
Use: EnumeratedBaseType = {ref, import, export};
BuildEmptyUsage: BaseFunction Returns[Usage];
RecordTypeUse: BaseFunction[Usage.arg, Type] Returns[Usage.result]
DamagedReps[Usage.arg];
RecordTypesUse: BaseFunction[Usage.arg, TypeList] Returns[Usage.result]
DamagedReps[Usage.arg];
RecordFcnUse: BaseFunction[Usage.arg, Name, Use, LookupContext] Returns[Usage.result]
DamagedReps[Usage.arg];
RecordAbstProdUse: BaseFunction[Usage.arg, Name, Use, LookupContext] Returns[Usage.result]
DamagedReps[Usage.arg];
RecordGenericTokenUse: BaseFunction[Usage.arg, Name, Use, LookupContext]
Returns[Usage.result]
DamagedReps[Usage.arg];
RecordLinkExport: BaseFunction[Usage.arg, LookupContext] Returns[Usage.result]
DamagedReps[Usage.arg];
RecordDefFileUse: BaseFunction[Usage.arg, ROPE, Use] Returns[Usage.result]
DamagedReps[Usage.arg];
BuildImplUseCode: BaseFunction[Usage.arg]
Returns[MesaCode.directory, MesaCode.imports, MesaCode.exports, MesaCode.open];
BuildDefUseCode: BaseFunction[Usage.arg, ROPE]
Returns[MesaCode.directory, MesaCode.open];
FakeUsageCopy: BaseFunction[Usage.arg] Returns[Usage.result]
DamagedReps[Usage.arg]
End.