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],
ups=1 sets level in construct containing this, and no more.
DefineMacro: PROC [name: ATOM, def: MacroDef]
]
RETURNS [result: REF ANY ← NIL];
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 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];
}.