-- Kipper.ThreeC4: November 17, 1985 3:04:50 pm PST
-- Sturgis, May 20, 1986 1:35:40 pm PDT
KipperCentral: Control Module;
KipperMain1: Module =
Begin
-- this will go away when all is filled in
Junk: AbstractType[foo];
Junk: AbstractProduction[];
for Junk: AbstractProduction[]
let foo[tree] ← 0;
foo: TreeRecursiveFunction[Tree] Returns[INT];
-- these should be built in
ROPE: CedarType From Rope;
INT, BOOLEAN: CedarType;
-- base types and functions
id: GenericToken = "tokenID";
Name: BaseType;
NameSeq: BaseType;
BuildName: BaseFunction[id] Returns[Name];
BuildNullName: BaseFunction Returns[Name];
FakeCopyName: BaseFunction[Name.arg] Returns[Name.result];
BuildImplModName: BaseFunction[id] Returns[Name];
BuildEmptyNameSeq: BaseFunction Returns[NameSeq];
AppendToNameSeq: BaseFunction[NameSeq.arg, Name] Returns[NameSeq.result]
DamagedReps[NameSeq.arg];
PrefixToNameSeq: BaseFunction[Name, NameSeq.arg] Returns[NameSeq.result]
DamagedReps[NameSeq.arg];
ElementSeq: BaseType;
BuildEmptyElementSeq: BaseFunction Returns[ElementSeq];
AppendNameToElementSeq: BaseFunction[ElementSeq.arg, Name] Returns[ElementSeq.result]
DamagedReps[ElementSeq.arg];
Type: BaseType;
FieldSeq: BaseType;
BuildEmptyFieldSeq: BaseFunction Returns[FieldSeq];
BuildOnePairFieldSeq: BaseFunction[NameSeq, Type] Returns[FieldSeq];
ConcatFieldSeq: BaseFunction[FieldSeq.arg1, FieldSeq.arg2] Returns[FieldSeq.result]
DamagedReps[FieldSeq.arg1]
SharedReps[FieldSeq.arg2, FieldSeq.result];
PrefixTypeToFieldSeq: BaseFunction[Type, FieldSeq.arg] Returns[FieldSeq.result]
DamagedReps[FieldSeq.arg];
-- here are the assorted type node construction functions
BuildNamedType: BaseFunction[NameSeq.a, NameSeq.b] Returns[Type];
BuildEnumeratedType: BaseFunction[ElementSeq] Returns[Type];
BuildRecordType: BaseFunction[FieldSeq] Returns[Type];
BuildRefType: BaseFunction[Type.arg] Returns[Type.result];
BuildRefAnyType: BaseFunction Returns[Type];
BuildListType: BaseFunction[Type.arg] Returns[Type.result];
BuildSeqType: BaseFunction[Name, Type.sizeType, Type.fieldType] Returns[Type.result];
TypeContext: BaseType;
BuildEmptyTypeContext: BaseFunction[Name.defFile, Name.implFile] Returns[TypeContext];
FakeCopyContext: BaseFunction[TypeContext.arg] Returns[TypeContext.result]
DamagedReps[TypeContext.arg];
NoteDefFileName: BaseFunction[TypeContext.arg, Name] Returns[TypeContext.result]
DamagedReps[TypeContext.arg];
NoteImplFileName: BaseFunction[TypeContext.arg, Name] Returns[TypeContext.result]
DamagedReps[TypeContext.arg];
RecordTypeDecl: BaseFunction[TypeContext.arg, Name.typeDefFile, Name.fcnDefFile, Name.fcnImplFile, NameSeq, Type] Returns[TypeContext.result]
DamagedReps[TypeContext.arg];
LookUpType: BaseFunction[TypeContext, NameSeq.arg1, NameSeq.arg2] Returns[Type];
CloseTypeContext: BaseFunction[TypeContext.arg] Returns[TypeContext.result]
DamagedReps[TypeContext.arg];
-- some recursive functions
FormName: TreeRecursiveFunction[Tree] Returns[Name];
FormNameSeq: TreeRecursiveFunction[Tree] Returns[NameSeq];
FormElementSeq: TreeRecursiveFunction[Tree] Returns[ElementSeq];
FormType: TreeRecursiveFunction[Tree] Returns[Type];
FormFieldSeq: TreeRecursiveFunction[Tree] Returns[FieldSeq];
FormTypeIdDesc: TreeRecursiveFunction[Tree] Returns[NameSeq.a, NameSeq.b];
EnlargeContext: TreeRecursiveFunction[Tree, Name.defFile, Name.implFile, TypeContext.arg] Returns[TypeContext.result]
DamagedReps[TypeContext.arg];
FormContext: TreeRecursiveFunction[Tree] Returns[TypeContext];
FormWhenceFromDecl: TreeRecursiveFunction[Tree, Name.arg] Returns[Name.result];
FormId: TreeRecursiveFunction[Tree] Returns[id];
FormVCaseHead: TreeRecursiveFunction[Tree] Returns[id, Type];
-- abstract grammar
ModuleBody: AbstractType[FormContext];
ModuleBody: AbstractProduction[id, DecList];
DecList: AbstractType[EnlargeContext];
DecList.one: AbstractProduction[Declaration];
DecList.more: AbstractProduction[DecList, Declaration];
Declaration: AbstractType[EnlargeContext];
Declaration.type: AbstractProduction[IdListR, DeclFrom, TypeExp];
DeclFrom: AbstractType[FormWhenceFromDecl];
DeclFrom.builtin: AbstractProduction[];
DeclFrom.fromcedardef: AbstractProduction[id];
DeclFrom.nominal: AbstractProduction[];
TypeExp: AbstractType[FormType];
TypeExp.typeid: AbstractProduction[TypeId];
TypeExp.elements: AbstractProduction[ElementList];
TypeExp.record: AbstractProduction[FieldList];
TypeExp.ref: AbstractProduction[TypeExp];
TypeExp.refAny: AbstractProduction[];
TypeExp.list: AbstractProduction[TypeExp];
TypeId: AbstractType[FormTypeIdDesc];
TypeId.mod: AbstractProduction[id, TypeId];
TypeId.one: AbstractProduction[IdListL];
ElementList: AbstractType[FormElementSeq];
ElementList.empty: AbstractProduction[];
ElementList.more: AbstractProduction[ElementList, Element];
Element: AbstractType[FormName];
Element.id: AbstractProduction[id];
FieldList: AbstractType[FormFieldSeq];
FieldList.empty: AbstractProduction[];
FieldList.null: AbstractProduction[];
FieldList.pairs: AbstractProduction[PairList];
FieldList.vpairs: AbstractProduction[PairList, VPair];
FieldList.types: AbstractProduction[TypeList];
FieldList.vtypes: AbstractProduction[TypeList, VPart];
PairList: AbstractType[FormFieldSeq];
PairList.empty: AbstractProduction[];
PairList.one: AbstractProduction[PairItem];
PairList.more: AbstractProduction[PairList, PairItem];
PairItem: AbstractType[FormFieldSeq];
PairItem: AbstractProduction[IdListR, TypeExp];
VPair: AbstractType[FormFieldSeq];
VPair: AbstractProduction[IdListR, VPart];
TypeList: AbstractType[FormFieldSeq];
TypeList.empty: AbstractProduction[];
TypeList.one: AbstractProduction[TypeExp];
TypeList.more: AbstractProduction[TypeExp, TypeList];
VPart: AbstractType[FormType];
VPart.seq: AbstractProduction[VCaseHead, TypeExp];
VCaseHead: AbstractType[FormVCaseHead];
VCaseHead.ident: AbstractProduction[Ident, Tagtype];
Tagtype: AbstractType[FormType];
Tagtype.exp: AbstractProduction[TypeExp];
IdListR: AbstractType[FormNameSeq];
IdListR.one: AbstractProduction[id];
IdListR.more: AbstractProduction[id, IdListR];
IdListL: AbstractType[FormNameSeq];
IdListL.one: AbstractProduction[id];
IdListL.more: AbstractProduction[IdListL, id];
Ident: AbstractType[FormId];
Ident: AbstractProduction[id];
-- some recursive function implementations
for ModuleBody: AbstractProduction[id, DecList]
let FormContext[tree] ← CloseTypeContext[context3]
where context3 ← EnlargeContext[DecList, defModName, implModName, context2]
where context2 ← NoteImplFileName[context1, implModName]
where context1 ← NoteDefFileName[context0, defModName]
where context0 ← BuildEmptyTypeContext[defModName, implModName]
where implModName ← BuildImplModName[id]
where defModName ← BuildName[id];
for DecList.one: AbstractProduction[Declaration]
let EnlargeContext[tree, defModuleName, implModuleName, context] ←
EnlargeContext[Declaration, defModuleName, implModuleName, context];
for DecList.more: AbstractProduction[DecList, Declaration]
let EnlargeContext[tree, defModuleName, implModuleName, context] ←
EnlargeContext[Declaration, defModuleName, implModuleName,
EnlargeContext[DecList, defModuleName, implModuleName, context]];
for Declaration.type: AbstractProduction[IdListR, DeclFrom, TypeExp]
let EnlargeContext[tree, defModuleName, implModuleName, context] ←
RecordTypeDecl[context, typeDefFile, defModuleName, implModuleName, typeNames, type]
where typeDefFile ← FormWhenceFromDecl[DeclFrom, defModuleName]
where typeNames ← FormNameSeq[IdListR]
where type ← FormType[TypeExp];
for DeclFrom.builtin: AbstractProduction[]
let FormWhenceFromDecl[tree, moduleName] ← BuildNullName[];
for DeclFrom.fromcedardef: AbstractProduction[id]
let FormWhenceFromDecl[tree, moduleName] ← BuildName[id];
for DeclFrom.nominal: AbstractProduction[]
let FormWhenceFromDecl[tree, moduleName] ← FakeCopyName[moduleName];
for TypeExp.typeid: AbstractProduction[TypeId]
let FormType[tree] ← BuildNamedType[FormTypeIdDesc[TypeId]];
for TypeExp.elements: AbstractProduction[ElementList]
let FormType[tree] ← BuildEnumeratedType[FormElementSeq[ElementList]];
for TypeExp.record: AbstractProduction[FieldList]
let FormType[tree] ← BuildRecordType[FormFieldSeq[FieldList]];
for TypeExp.ref: AbstractProduction[TypeExp]
let FormType[tree] ← BuildRefType[FormType[TypeExp]];
for TypeExp.refAny: AbstractProduction[]
let FormType[tree] ← BuildRefAnyType[];
for TypeExp.list: AbstractProduction[TypeExp]
let FormType[tree] ← BuildListType[FormType[TypeExp]];
for TypeId.mod: AbstractProduction[id, TypeId]
let FormTypeIdDesc[tree] ← <PrefixToNameSeq[BuildName[id], seq1], seq2>
where <seq1, seq2> ← FormTypeIdDesc[TypeId];
for TypeId.one: AbstractProduction[IdListL]
let FormTypeIdDesc[tree] ← <BuildEmptyNameSeq[], FormNameSeq[IdListL]>;
for ElementList.empty: AbstractProduction[]
let FormElementSeq[tree] ← BuildEmptyElementSeq[];
for ElementList.more: AbstractProduction[ElementList, Element]
let FormElementSeq[tree] ←
AppendNameToElementSeq[FormElementSeq[ElementList], FormName[Element]];
for Element.id: AbstractProduction[id]
let FormName[tree] ← BuildName[id];
for FieldList.empty: AbstractProduction[]
let FormFieldSeq[tree] ← BuildEmptyFieldSeq[];
for FieldList.null: AbstractProduction[]
let FormFieldSeq[tree] ← BuildEmptyFieldSeq[];
for FieldList.pairs: AbstractProduction[PairList]
let FormFieldSeq[tree] ← FormFieldSeq[PairList];
for FieldList.vpairs: AbstractProduction[PairList, VPair]
let FormFieldSeq[tree] ← ConcatFieldSeq[FormFieldSeq[PairList], FormFieldSeq[VPair]];
for FieldList.types: AbstractProduction[TypeList]
let FormFieldSeq[tree] ← FormFieldSeq[TypeList];
for FieldList.vtypes: AbstractProduction[TypeList, VPart]
let FormFieldSeq[tree] ← ConcatFieldSeq[FormFieldSeq[TypeList], vFieldSeq]
where vFieldSeq ← PrefixTypeToFieldSeq[FormType[VPart], BuildEmptyFieldSeq[]];
for PairList.empty: AbstractProduction[]
let FormFieldSeq[tree] ← BuildEmptyFieldSeq[];
for PairList.one: AbstractProduction[PairItem]
let FormFieldSeq[tree] ← FormFieldSeq[PairItem];
for PairList.more: AbstractProduction[PairList, PairItem]
let FormFieldSeq[tree] ← ConcatFieldSeq[FormFieldSeq[PairList], FormFieldSeq[PairItem]];
for PairItem: AbstractProduction[IdListR, TypeExp]
let FormFieldSeq[tree] ← BuildOnePairFieldSeq[FormNameSeq[IdListR], FormType[TypeExp]];
for VPair: AbstractProduction[IdListR, VPart]
let FormFieldSeq[tree] ← BuildOnePairFieldSeq[FormNameSeq[IdListR], FormType[VPart]];
for TypeList.empty: AbstractProduction[]
let FormFieldSeq[tree] ← BuildEmptyFieldSeq[];
for TypeList.one: AbstractProduction[TypeExp]
let FormFieldSeq[tree] ← PrefixTypeToFieldSeq[FormType[TypeExp], BuildEmptyFieldSeq[]];
for TypeList.more: AbstractProduction[TypeExp, TypeList]
let FormFieldSeq[tree] ← PrefixTypeToFieldSeq[FormType[TypeExp], FormFieldSeq[TypeList]];
for VPart.seq: AbstractProduction[VCaseHead, TypeExp]
let FormType[tree] ← BuildSeqType[sizeName, sizeType, fieldType]
where sizeName ← BuildName[sizeId]
where <sizeId, sizeType> ← FormVCaseHead[VCaseHead]
where fieldType ← FormType[TypeExp];
for VCaseHead.ident: AbstractProduction[Ident, Tagtype]
let FormVCaseHead[tree] ← <FormId[Ident], FormType[Tagtype]>;
for Tagtype.exp: AbstractProduction[TypeExp]
let FormType[tree] ← FormType[TypeExp];
for IdListR.one: AbstractProduction[id]
let FormNameSeq[tree] ← AppendToNameSeq[BuildEmptyNameSeq[], BuildName[id]];
for IdListR.more: AbstractProduction[id, IdListR]
let FormNameSeq[tree] ← PrefixToNameSeq[BuildName[id], FormNameSeq[IdListR]];
for IdListL.one: AbstractProduction[id]
let FormNameSeq[tree] ← AppendToNameSeq[BuildEmptyNameSeq[], BuildName[id]];
for IdListL.more: AbstractProduction[IdListL, id]
let FormNameSeq[tree] ← AppendToNameSeq[FormNameSeq[IdListL], BuildName[id]];
for Ident: AbstractProduction[id]
let FormId[tree] ← id
End;
KipperMain2: Module =
Begin
-- following here is the concrete syntax
-- adapted from XCedar.grammar of lr1parsing stuff
{ ";" ":" "," "[" "]" "=" } : SimpleTokens;
{ "." "{" "}" "RECORD" "REF" "ANY" } : SimpleTokens;
{ "LIST" "SEQUENCE" "OF" } : SimpleTokens;
{ "NULL" } : SimpleTokens;
{"FROM" } : SimpleTokens;
{ "TYPE" } : SimpleTokens;
{ "CEDAR" } : SimpleTokens;
{"MODULE" "BEGIN" "END" } : SimpleTokens;
MainGoal: NonTerminal Builds Junk;
for MainGoal ← ModuleBody
Build Junk[];
ModuleBody: NonTerminal Builds ModuleBody;
for ModuleBody.nosemicolon ← id ":" "MODULE" "=" "BEGIN" declist "END" "."
Build ModuleBody[id, declist];
for ModuleBody.eithsemicolon ← id ":" "MODULE" "=" "BEGIN" declist ";" "END" "."
Build ModuleBody[id, declist];
-- a fragment of the Cedar type syntax
declist: NonTerminal Builds DecList;
for declist.one ← declaration
Build DecList.one[declaration];
for declist.more ← declist ";" declaration
Build DecList.more[declist, declaration];
declaration: NonTerminal Builds Declaration;
for declaration.type ← identlist "TYPE" "=" typeexp
Build Declaration.type[identlist, DeclFrom.nominal[(identlist,typeexp)], typeexp];
for declaration.cedartype ← identlist "CEDAR" "TYPE" from "=" typeexp
Build Declaration.type[identlist, from, typeexp];
from: NonTerminal Builds DeclFrom;
for from.no ←
Build DeclFrom.builtin[];
for from.yes ← "FROM" id
Build DeclFrom.fromcedardef[id];
identlist: NonTerminal Builds IdListR;
for identlist ← identlistP
Build identlistP;
identlistP: NonTerminal Builds IdListR;
for identlistP.id ← id ":"
Build IdListR.one[id];
for identlistP.idmore← id "," identlistP
Build IdListR.more[id, identlistP];
typeexp: NonTerminal Builds TypeExp;
for typeexp.id ← id
Build TypeExp.typeid[TypeId.one[IdListL.one[id]]];
for typeexp.typeid ← typeid
Build TypeExp.typeid[typeid];
for typeexp.typecons ← typecons
Build typecons;
typeid: NonTerminal Builds TypeId;
for typeid.idid ← id.a id.b
Build TypeId.mod[id.a, TypeId.one[IdListL.one[id.b]]];
for typeid.idtypeid ← id typeid
Build TypeId.mod[id, typeid];
for typeid.typeidp ← typeidP
Build TypeId.one[typeidP];
typeidP: NonTerminal Builds IdListL;
for typeidP.two ← id.a "." id.b
Build IdListL.more[IdListL.one[id.a], id.b];
for typeidP.more ← typeidP "." id
Build IdListL.more[typeidP, id];
typecons: NonTerminal Builds TypeExp;
for typecons.elements ← "{" elementlist "}"
Build TypeExp.elements[elementlist];
for typecons.record ← "RECORD" reclist
Build TypeExp.record[reclist];
for typecons.ref ← "REF" typeexp
Build TypeExp.ref[typeexp];
for typecons.refany ← "REF" "ANY"
Build TypeExp.refAny[];
for typecons.list ← "LIST" "OF" typeexp
Build TypeExp.list[typeexp];
elementlist: NonTerminal Builds ElementList;
for elementlist.empty ←
Build ElementList.empty[];
for elementlist.nonempty ← elementlistP
Build elementlistP;
elementlistP: NonTerminal Builds ElementList;
for elementlistP.one ← element
Build ElementList.more[ElementList.empty[[element, element)], element];
for elementlistP.more ← elementlistP "," element
Build ElementList.more[elementlistP, element];
element: NonTerminal Builds Element;
for element.id ← id
Build Element.id[id];
reclist: NonTerminal Builds FieldList;
for reclist.empty ← "[" "]"
Build FieldList.empty[];
for reclist.null ← "NULL"
Build FieldList.null[];
for reclist.pairs ← "[" pairlist "]"
Build FieldList.pairs[pairlist];
for reclist.types ← "[" typelist "]"
Build FieldList.types[typelist];
for reclist.vpairs ← "[" pairlist "," variantpair "]"
Build FieldList.vpairs[pairlist, variantpair];
for reclist.vpart ← "[" variantpart "]"
Build FieldList.vtypes[TypeList.empty[[variantpart, variantpart)], variantpart];
for reclist.vpair ← "[" variantpair "]"
Build FieldList.vpairs[PairList.empty[[variantpair, variantpair)], variantpair];
variantpair: NonTerminal Builds VPair;
for variantpair ← identlist variantpart
Build VPair[identlist, variantpart];
variantpart: NonTerminal Builds VPart;
for variantpart.seq ← "SEQUENCE" vcasehead "OF" typeexp
Build VPart.seq[vcasehead, typeexp];
vcasehead: NonTerminal Builds VCaseHead;
for vcasehead.ident ← ident tagtype
Build VCaseHead.ident[ident, tagtype];
tagtype: NonTerminal Builds Tagtype;
for tagtype.exp ← typeexp
Build Tagtype.exp[typeexp];
ident: NonTerminal Builds Ident;
for ident ← id ":"
Build Ident[id];
pairlist: NonTerminal Builds PairList;
for pairlist.one ← pairitem
Build PairList.one[pairitem];
for pairlist.more ← pairlist "," pairitem
Build PairList.more[pairlist, pairitem];
pairitem: NonTerminal Builds PairItem;
for pairitem ← identlist typeexp
Build PairItem[identlist, typeexp];
typelist: NonTerminal Builds TypeList;
for typelist.typecons ← typecons
Build TypeList.one[typecons];
for typelist.typeid ← typeid
Build TypeList.one[TypeExp.typeid[typeid]];
for typelist.id ← id
Build TypeList.one[TypeExp.typeid[TypeId.one[IdListL.one[id]]]];
for typelist.typeconsmore ← typecons "," typelist
Build TypeList.more[typecons, typelist];
for typelist.typeidmore ← typeid "," typelist
Build TypeList.more[TypeExp.typeid[typeid], typelist];
for typelist.idmore ← id "," typelist
Build TypeList.more[TypeExp.typeid[TypeId.one[IdListL.one[id]]], typelist]
End.