<> <> DIRECTORY EDIFAndCore, EDIFfing, IO, Rope; EDIFParsing2: CEDAR DEFINITIONS = {OPEN EDIFAndCore, EDIFfing; ParseError: ERROR [ parseStack: ParseStack, <> nonTerminal: ATOM, syntaxRule: SyntaxRule <> ]; ParseStack: TYPE = LIST OF ParseTreePlace; ParseTreePlace: TYPE = RECORD [list: REF list ParseTreePrivate, index: INT]; Register: PROC [ outerKey: ATOM _ NIL, key: ATOM, start: PROC [outerKey, key: ATOM, name: NameStuff, outerConv: REF ANY] RETURNS [conv: REF ANY] _ NIL, finish: PROC [conv: REF ANY] _ NIL, rule: SyntaxRule ]; SyntaxRuleList: TYPE = LIST OF SyntaxRule; SyntaxRule: TYPE = REF SyntaxRulePrivate; SyntaxRulePrivate: TYPE = RECORD [ variant: SELECT type: SyntaxRuleType FROM terminal => [vart: SELECT class: * FROM any => [], string => [], identifier => [], integer => [min, max: INT], keyword => [key: ROPE], ENDCASE], nonTerminal => [category: ATOM], choice => [choices: SyntaxRuleList], repeat => [r: SyntaxRule, atLeastOnce: BOOL], series => [elts: SyntaxRuleList], optional => [r: SyntaxRule], nest => [r: SyntaxRule], atMostOne => [r: SyntaxRule], cut => [], ENDCASE ]; SyntaxRuleType: TYPE = {terminal, nonTerminal, choice, repeat, series, optional, nest, atMostOne, cut}; }.