DIRECTORY EDIFfing, EDIFGrammar, HashTable, Rope; EDIFSemantics: CEDAR DEFINITIONS IMPORTS Rope = {OPEN EDIFGrammar, EDIFfing; SyntaxError: SIGNAL [ pt: ParseTree, msg: ROPE, severity: Severity _ error ]; Severity: TYPE = {warning, error}; LORA: TYPE = LIST OF REF ANY; REFINT: TYPE = REF INT; MacroDef: TYPE = REF MacroDefPrivate; MacroDefPrivate: TYPE = RECORD [ requiredFormals, optionalFormals, extraFormals: IdPtList _ NIL, okToSkipTail: BOOL _ FALSE, generators: ParseTreeGeneratorList _ NIL, comments: LIST OF LIST OF ROPE _ NIL ]; IdPtList: TYPE = LIST OF IdPt; IdPt: TYPE = REF identifier ParseTreePrivate; ParseTreeGeneratorList: TYPE = LIST OF ParseTreeGenerator; ParseTreeGenerator: TYPE = REF ParseTreeGeneratorPrivate; ParseTreeGeneratorPrivate: TYPE = RECORD [ quaPT: ParseTree, variant: SELECT type: ParseTreeGeneratorType FROM literal => [pt: ParseTree], name => [id: ATOM], buildList => [elts: ParseTreeGeneratorList], buildName => [id: ATOM], forEach => [domain: ATOMList, range: ParseTreeGeneratorList], index => [var: ATOM], ENDCASE ]; ParseTreeGeneratorType: TYPE = {literal, name, buildList, buildName, forEach, index}; Semantics: TYPE = REF SemanticsPrivate; SemanticsPrivate: TYPE = RECORD [ Before: Beforer _ NIL, After: Afterer _ NIL, PerSubResult: SubResultConsumer _ NIL, HandleSpecially: SpecialHandler _ NIL, FilterResult: ResultFilter _ NIL ]; Beforer: TYPE = PROC [parentContext: REF ANY, selfTree: ParseTree] RETURNS [context: REF ANY _ NIL]; Afterer: TYPE = PROC [ parentContext, context: REF ANY, selfTree: ParseTree, SetLevel: PROC [nLevel: Level, ups: NAT], DefineMacro: PROC [name: ATOM, def: MacroDef] ] RETURNS [result: REF ANY _ NIL]; SubResultConsumer: TYPE = PROC [parentContext, context, result: REF ANY, index: INT, subTree: ParseTree]; ResultFilter: TYPE = PROC [subResult: REF ANY, subRule: Rule, nc: NamingContext] RETURNS [result: REF ANY]; ResultOffTail: PROC = INLINE {}; SpecialHandler: TYPE = PROC [ptl: ParseTreeList, parentTree: ParseTree, r, repeatSub: Rule, level: Level, onces: Onces, description: ROPE, sem: Semantics, context: REF ANY, SetLevel: PROC [nLevel: Level, ups: NAT], macros: HashTable.Table, ConsumeResult: PROC [res: REF ANY, pt: ParseTree], nc: NamingContext, keyword: ATOM] RETURNS [match: BOOL, ptail: ParseTreeList, result: REF ANY, lastWasStar: BOOL]; TreeWork: PROC [ptl: ParseTreeList, parentTree: ParseTree, r, repeatSub: Rule, level: Level, onces: Onces, okToFail: BOOL, description: ROPE, sem: Semantics, context: REF ANY, SetLevel: PROC [nLevel: Level, ups: NAT], macros: HashTable.Table, ConsumeResult: PROC [res: REF ANY, pt: ParseTree], nc: NamingContext] RETURNS [match: BOOL, ptail: ParseTreeList, result: REF ANY]; Onces: TYPE = HashTable.Table; NamingContext: TYPE = REF NamingContextPrivate; NamingContextPrivate: TYPE = RECORD [ parent: NamingContext _ NIL, class: NamingContextClass, data: REF ANY _ NIL]; NamingContextClass: TYPE = REF NamingContextClassPrivate; NamingContextClassPrivate: TYPE = RECORD [ Lookup: PROC [nc: NamingContext, name: ATOM] RETURNS [found: BOOL, value: REF ANY], Define: PROC [nc: NamingContext, name: ATOM, value: REF ANY, re: BOOL _ FALSE] ]; Lookup: PROC [nc: NamingContext, name: ATOM] RETURNS [found: BOOL, value: REF ANY]; Define: PROC [nc: NamingContext, name: ATOM, value: REF ANY, re: BOOL _ FALSE]; CreateHashTableNamingContext: PROC [parent: NamingContext _ NIL] RETURNS [nc: NamingContext]; DiscardResult: PROC [res: REF ANY, pt: ParseTree]; SS: PROC [category: ATOM, semp: SemanticsPrivate]; Traverse: PROC [pt: ParseTree, r: Rule, level: Level, description: ROPE, context: REF ANY _ NIL, macros: HashTable.Table _ NIL, nc: NamingContext _ NIL] RETURNS [match: BOOL, result: REF ANY _ NIL]; AtomNameEq: PROC [n1, n2: ATOM] RETURNS [BOOL]; RopeNameEq: PROC [n1, n2: ROPE] RETURNS [eq: BOOL] = INLINE {eq _ Rope.Equal[n1, n2, FALSE]}; MakeAtomDict: PROC RETURNS [dict: HashTable.Table]; MakeRopeDict: PROC RETURNS [dict: HashTable.Table]; }. ΌEDIFSemantics.Mesa Spreitzer, February 24, 1986 11:31:11 pm PST ups=1 sets level in construct containing this, and no more. index=1 for first thing seen = first thing after keyword. Κχ– "cedar" style˜code™K™,—K˜KšΟk œ(˜1K˜šΠbx œœ ˜ Kšœ˜ Kšœœ˜K˜šΠbl œœ˜Kšœ˜Kšœœ˜ K˜Kšœ˜—K˜Kšœ œ˜"K˜Kš œœœœœœ˜Kšœœœœ˜K˜Kšœ œœ˜%šœœœ˜ Kšœ;œ˜?Kšœœœ˜Kšœ%œ˜)Kš œ œœœœœ˜$K˜—K˜Kšœ œœœ˜Kšœœœ˜-K˜Kšœœœœ˜:Kšœœœ˜9šœœœ˜*Kšœ˜šœ œ˜1Kšœ˜Kšœ œ˜Kšœ,˜,Kšœœ˜Kšœ=˜=Kšœœ˜Kš˜—K˜—K˜Kšœœ9˜UK˜Kšœ œœ˜'šœœœ˜!Kšœœ˜Kšœœ˜Kšœ"œ˜&Kšœ"œ˜&Kšœ˜ K˜—K˜KšΟnœœœœœœ œœœ˜dšœ œ˜šœ˜Kšœœœ˜ K˜š œœΟgœœ˜)K™;—Kš  œœœ˜-Kšœ˜—Kšœ œœœ˜ —K˜š  œœœ"œœ œ˜iKšœ9™9—K˜Kš  œœœ œœ$œ œœ˜kK˜Kš  œœœ˜ K˜Kš( œœœjœœœ œœ‘œœ  œœœœ.œœ œ œœœ˜•K˜Kš$ œœgœœœœ œœ‘œœ  œœœœ%œ œ œœ˜φK˜Kšœœ˜K˜Kšœœœ˜/šœœœ˜%Kšœœ˜Kšœ˜Kšœœœœ˜—K˜Kšœœœ˜9šœœœ˜*Kš œœœœ œ œœ˜SKš œœœ œœœœ˜NK˜—K˜Kš œœœœ œ œœ˜SKš œœœ œœœœ˜OK˜Kš œœœœ˜]K˜Kš  œœœœ˜2K˜Kšœœ œ˜2K˜Kš œœ5œ œœœœœœ œ œœœ˜ΖK˜Kš   œœ œœœ˜/š   œœ œœœ˜2Kšœœœ˜*—K˜Kš  œœœ˜3Kš  œœœ˜3K˜K˜——…—€W