<> <> DIRECTORY EDIFDataStructure, EDIFfing, EDIFGrammar, EDIFSemantics, HashTable; EDIFSemanticDefs1: CEDAR PROGRAM IMPORTS EDIFGrammar, EDIFSemantics, HashTable = {OPEN EDIFDataStructure, EDIFGrammar, EDIFSemantics; DefineEm: PROC = { SS[ DL[$EDIF, LIST[NameDef[], $Status, Star[$Keyword], Opt[$Rename], StarCh[LIST[$Design, $External, $Library, $Comment, $UserData]] ]], [BeforeEDIF, AfterEDIF]]; SS[ DL[$Status, LIST[Opt[$EDIFVersion], Opt[$EDIFLevel], StarCh[LIST[$Written, $Comment, $UserData]] ]], [BeforeStatus, AfterStatus]]; }; BeforeEDIF: Beforer = { ew: EDIFWhole = NEW [EDIFWholePrivate _ [ status: NIL, designs: HashTable.Create[equal: HashTable.RopeEqualModCase, hash: HashTable.HashRopeModCase], libraries: HashTable.Create[equal: HashTable.RopeEqualModCase, hash: HashTable.HashRopeModCase], externalLibraries: HashTable.Create[equal: HashTable.RopeEqualModCase, hash: HashTable.HashRopeModCase] ]]; context _ ew; }; AfterEDIF: Afterer = { ew: EDIFWhole = NARROW[context]; result _ ew; }; BeforeStatus: Beforer = { s: Status = NEW [StatusPrivate _ []]; WITH parentContext SELECT FROM ew: EDIFWhole => { IF ew.status # NIL THEN ERROR; ew.status _ s}; ENDCASE => ERROR; context _ s; }; AfterStatus: Afterer = { s: Status = NARROW[context]; IF s.level # unspecifiedLevel THEN SetLevel[s.level, 1]; result _ s; }; }.