EDIFSemantics.Mesa
Spreitzer, February 24, 1986 11:31:11 pm PST
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: BOOLFALSE,
generators: ParseTreeGeneratorList ← NIL,
comments: LIST OF LIST OF ROPENIL
];
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 ANYNIL];
Afterer: TYPE =
PROC [
parentContext, context: REF ANY,
selfTree: ParseTree,
SetLevel: PROC [nLevel: Level, ups: NAT],
ups=1 sets level in construct containing this, and no more.
DefineMacro: PROC [name: ATOM, def: MacroDef]
]
RETURNS [result: REF ANYNIL];
SubResultConsumer: TYPE = PROC [parentContext, context, result: REF ANY, index: INT, subTree: ParseTree];
index=1 for first thing seen = first thing after keyword.
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 ANYNIL];
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: BOOLFALSE]
];
Lookup: PROC [nc: NamingContext, name: ATOM] RETURNS [found: BOOL, value: REF ANY];
Define: PROC [nc: NamingContext, name: ATOM, value: REF ANY, re: BOOLFALSE];
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 ANYNIL, macros: HashTable.Table ← NIL, nc: NamingContext ← NIL] RETURNS [match: BOOL, result: REF ANYNIL];
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];
}.