<<>> <> <> <> <<>> DIRECTORY KipperSupport USING [ UnKipperer, UnKipperRef, UnKipperRope, RecordUnKipperedRef, Kipperer, KipperRope, KipperRef ], Basics USING [ RawBytes ], IO USING [ STREAM, UnsafeGetBlock, UnsafePutBlock ], OneCasabaParserData USING [], OneCasabaParserPrivate USING [ TokenTable, TokenCellBody, ParserTable, ParserTableBody, TokenTableBody, ActionTable, ActionTableBody, SymbolTable, SymbolTableBody, ActionCell, SymbolCell, TokenCell, ActionCellBody, SymbolCellBody ], Rope USING [ ROPE ]; OneCasabaParserDataImpl: CEDAR PROGRAM IMPORTS KipperSupport, IO EXPORTS OneCasabaParserData = { OPEN Basics, IO, KipperSupport, OneCasabaParserPrivate, Rope; RawBytes: PROC [ local: POINTER ] RETURNS [ raw: LONG POINTER TO Basics.RawBytes ] ~ TRUSTED INLINE { raw ¬ LOOPHOLE[LONG[local], LONG POINTER TO Basics.RawBytes] }; InternalPut16: PROC [ k: Kipperer, ptr: LONG POINTER ] ~ TRUSTED INLINE { k.stream.UnsafePutBlock[[RawBytes[ptr], 2, 2]]; -- magic here: dorado: 0, sparc: 2! }; InternalGet16: PROC [ u: UnKipperer, ptr: POINTER ] ~ TRUSTED INLINE { IF ( u.stream.UnsafeGetBlock[[RawBytes[ptr], 2, 2]] # 2 ) THEN ERROR; }; KipperActionCellBodyRef: PUBLIC PROC [ kipperer: Kipperer, ActionCellBodyRef: REF ActionCellBody ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; IF KipperRef[kipperer, ActionCellBodyRef] THEN { InternalPut16[kipperer, @(ActionCellBodyRef.state)]; InternalPut16[kipperer, @(ActionCellBodyRef.terminal)]; word ¬ ORD[(ActionCellBodyRef.action)]; InternalPut16[kipperer, @(word)]; InternalPut16[kipperer, @(ActionCellBodyRef.nextState)]; InternalPut16[kipperer, @(ActionCellBodyRef.ruleNumber)]; InternalPut16[kipperer, @(ActionCellBodyRef.leftSide)]; InternalPut16[kipperer, @(ActionCellBodyRef.ruleSize)]; KipperActionCell[kipperer, (ActionCellBodyRef.next)]; }; }; UnKipperActionCellBodyRef: PUBLIC PROC [ unKipperer: UnKipperer ] RETURNS [ ActionCellBodyRef: REF ActionCellBody ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; [flag, refAny] ¬ UnKipperRef[unKipperer]; IF ( flag ) THEN { refAny ¬ NEW[ActionCellBody]; RecordUnKipperedRef[unKipperer, refAny]; ActionCellBodyRef ¬ NARROW[refAny]; InternalGet16[unKipperer, @(ActionCellBodyRef.state)]; InternalGet16[unKipperer, @(ActionCellBodyRef.terminal)]; InternalGet16[unKipperer, @(word)]; (ActionCellBodyRef.action) ¬ VAL[word]; InternalGet16[unKipperer, @(ActionCellBodyRef.nextState)]; InternalGet16[unKipperer, @(ActionCellBodyRef.ruleNumber)]; InternalGet16[unKipperer, @(ActionCellBodyRef.leftSide)]; InternalGet16[unKipperer, @(ActionCellBodyRef.ruleSize)]; (ActionCellBodyRef.next) ¬ UnKipperActionCell[unKipperer]; } ELSE ActionCellBodyRef ¬ NARROW[refAny]; }; KipperActionTableBodyRef: PUBLIC PROC [ kipperer: Kipperer, ActionTableBodyRef: REF ActionTableBody ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; IF ( KipperRef[kipperer, ActionTableBodyRef] ) THEN { count: CARD16 ¬ ActionTableBodyRef.nSlots; InternalPut16[kipperer, @(count)]; FOR i: CARD16 IN[0..(ActionTableBodyRef.nSlots)) DO KipperActionCell[kipperer, (ActionTableBodyRef.actions[i])]; ENDLOOP; }; }; UnKipperActionTableBodyRef: PUBLIC PROC [ unKipperer: UnKipperer ] RETURNS [ ActionTableBodyRef: REF ActionTableBody ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; [flag, refAny] ¬ UnKipperRef[unKipperer]; IF ( flag ) THEN { count: CARD16; InternalGet16[unKipperer, @(count)]; refAny ¬ NEW[ActionTableBody[count]]; RecordUnKipperedRef[unKipperer, refAny]; ActionTableBodyRef ¬ NARROW[refAny]; FOR i: CARD16 IN[0..(ActionTableBodyRef.nSlots)) DO (ActionTableBodyRef.actions[i]) ¬ UnKipperActionCell[unKipperer]; ENDLOOP; } ELSE ActionTableBodyRef ¬ NARROW[refAny]; }; KipperTokenCellBodyRef: PUBLIC PROC [ kipperer: Kipperer, TokenCellBodyRef: REF TokenCellBody ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; IF ( KipperRef[kipperer, TokenCellBodyRef] ) THEN { KipperRope[kipperer, (TokenCellBodyRef.name)]; InternalPut16[kipperer, @(TokenCellBodyRef.symbolCode)]; word ¬ ORD[(TokenCellBodyRef.kind)]; InternalPut16[kipperer, @(word)]; KipperRope[kipperer, (TokenCellBodyRef.spelling)]; word ¬ ORD[(TokenCellBodyRef.case)]; InternalPut16[kipperer, @(word)]; KipperTokenCell[kipperer, (TokenCellBodyRef.next)]; }; }; UnKipperTokenCellBodyRef: PUBLIC PROC [ unKipperer: UnKipperer ] RETURNS [ TokenCellBodyRef: REF TokenCellBody ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; [flag, refAny] ¬ UnKipperRef[unKipperer]; IF ( flag ) THEN { refAny ¬ NEW[TokenCellBody]; RecordUnKipperedRef[unKipperer, refAny]; TokenCellBodyRef ¬ NARROW[refAny]; (TokenCellBodyRef.name)¬ UnKipperRope[unKipperer]; InternalGet16[unKipperer, @(TokenCellBodyRef.symbolCode)]; InternalGet16[unKipperer, @(word)]; (TokenCellBodyRef.kind) ¬ VAL[word]; (TokenCellBodyRef.spelling)¬ UnKipperRope[unKipperer]; InternalGet16[unKipperer, @(word)]; (TokenCellBodyRef.case) ¬ VAL[word]; (TokenCellBodyRef.next) ¬ UnKipperTokenCell[unKipperer]; } ELSE TokenCellBodyRef ¬ NARROW[refAny]; }; KipperTokenTableBodyRef: PUBLIC PROC [ kipperer: Kipperer, TokenTableBodyRef: REF TokenTableBody ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; IF ( KipperRef[kipperer, TokenTableBodyRef] ) THEN { count: CARD16 ¬ TokenTableBodyRef.nSlots; InternalPut16[kipperer, @(count)]; KipperTokenCell[kipperer, (TokenTableBodyRef.idToken)]; FOR i: CARD16 IN[0..(TokenTableBodyRef.nSlots)) DO KipperTokenCell[kipperer, (TokenTableBodyRef.tokens[i])]; ENDLOOP; }; }; UnKipperTokenTableBodyRef: PUBLIC PROC [ unKipperer: UnKipperer ] RETURNS [ TokenTableBodyRef: REF TokenTableBody ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; [flag, refAny] ¬ UnKipperRef[unKipperer]; IF ( flag ) THEN { count: CARD16; InternalGet16[unKipperer, @(count)]; refAny ¬ NEW[TokenTableBody[count]]; RecordUnKipperedRef[unKipperer, refAny]; TokenTableBodyRef ¬ NARROW[refAny]; (TokenTableBodyRef.idToken) ¬ UnKipperTokenCell[unKipperer]; FOR i: CARD16 IN[0..(TokenTableBodyRef.nSlots)) DO (TokenTableBodyRef.tokens[i]) ¬ UnKipperTokenCell[unKipperer]; ENDLOOP; } ELSE TokenTableBodyRef ¬ NARROW[refAny]; }; KipperSymbolCellBodyRef: PUBLIC PROC [ kipperer: Kipperer, SymbolCellBodyRef: REF SymbolCellBody ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; IF ( KipperRef[kipperer, SymbolCellBodyRef] ) THEN { KipperRope[kipperer, (SymbolCellBodyRef.name)]; InternalPut16[kipperer, @(SymbolCellBodyRef.code)]; KipperSymbolCell[kipperer, (SymbolCellBodyRef.next)]; }; }; UnKipperSymbolCellBodyRef: PUBLIC PROC [ unKipperer: UnKipperer ] RETURNS [ SymbolCellBodyRef: REF SymbolCellBody ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; [flag, refAny] ¬ UnKipperRef[unKipperer]; IF ( flag ) THEN { refAny ¬ NEW[SymbolCellBody]; RecordUnKipperedRef[unKipperer, refAny]; SymbolCellBodyRef ¬ NARROW[refAny]; (SymbolCellBodyRef.name)¬ UnKipperRope[unKipperer]; InternalGet16[unKipperer, @(SymbolCellBodyRef.code)]; (SymbolCellBodyRef.next) ¬ UnKipperSymbolCell[unKipperer]; } ELSE SymbolCellBodyRef ¬ NARROW[refAny]; }; KipperSymbolTableBodyRef: PUBLIC PROC [ kipperer: Kipperer, SymbolTableBodyRef: REF SymbolTableBody ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; IF ( KipperRef[kipperer, SymbolTableBodyRef] ) THEN { count: CARD16 ¬ SymbolTableBodyRef.nSlots; InternalPut16[kipperer, @(count)]; FOR i: CARD16 IN[0..(SymbolTableBodyRef.nSlots)) DO KipperSymbolCell[kipperer, (SymbolTableBodyRef.symbols[i])]; ENDLOOP; }; }; UnKipperSymbolTableBodyRef: PUBLIC PROC [ unKipperer: UnKipperer ] RETURNS [ SymbolTableBodyRef: REF SymbolTableBody ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; [flag, refAny] ¬ UnKipperRef[unKipperer]; IF ( flag ) THEN { count: CARD16; InternalGet16[unKipperer, @(count)]; refAny ¬ NEW[SymbolTableBody[count]]; RecordUnKipperedRef[unKipperer, refAny]; SymbolTableBodyRef ¬ NARROW[refAny]; FOR i: CARD16 IN[0..(SymbolTableBodyRef.nSlots)) DO (SymbolTableBodyRef.symbols[i]) ¬ UnKipperSymbolCell[unKipperer]; ENDLOOP; } ELSE SymbolTableBodyRef ¬ NARROW[refAny]; }; KipperParserTableBodyRef: PUBLIC PROC [ kipperer: Kipperer, ParserTableBodyRef: REF ParserTableBody ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; IF ( KipperRef[kipperer, ParserTableBodyRef] ) THEN { KipperSymbolCell[kipperer, (ParserTableBodyRef.unAnalyzedSymbols)]; InternalPut16[kipperer, @(ParserTableBodyRef.nSymbols)]; KipperTokenCell[kipperer, (ParserTableBodyRef.unAnalyzedTokens)]; InternalPut16[kipperer, @(ParserTableBodyRef.nTokens)]; KipperActionCell[kipperer, (ParserTableBodyRef.unAnalyzedActions)]; InternalPut16[kipperer, @(ParserTableBodyRef.nActions)]; InternalPut16[kipperer, @(ParserTableBodyRef.startState)]; KipperSymbolTable[kipperer, (ParserTableBodyRef.symbolTable)]; KipperTokenTable[kipperer, (ParserTableBodyRef.tokenTable)]; KipperActionTable[kipperer, (ParserTableBodyRef.actionTable)]; }; }; UnKipperParserTableBodyRef: PUBLIC PROC [ unKipperer: UnKipperer ] RETURNS [ ParserTableBodyRef: REF ParserTableBody ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; [flag, refAny] ¬ UnKipperRef[unKipperer]; IF ( flag ) THEN { refAny ¬ NEW[ParserTableBody]; RecordUnKipperedRef[unKipperer, refAny]; ParserTableBodyRef ¬ NARROW[refAny]; (ParserTableBodyRef.unAnalyzedSymbols) ¬ UnKipperSymbolCell[unKipperer]; InternalGet16[unKipperer, @(ParserTableBodyRef.nSymbols)]; (ParserTableBodyRef.unAnalyzedTokens) ¬ UnKipperTokenCell[unKipperer]; InternalGet16[unKipperer, @(ParserTableBodyRef.nTokens)]; (ParserTableBodyRef.unAnalyzedActions) ¬ UnKipperActionCell[unKipperer]; InternalGet16[unKipperer, @(ParserTableBodyRef.nActions)]; InternalGet16[unKipperer, @(ParserTableBodyRef.startState)]; (ParserTableBodyRef.symbolTable) ¬ UnKipperSymbolTable[unKipperer]; (ParserTableBodyRef.tokenTable) ¬ UnKipperTokenTable[unKipperer]; (ParserTableBodyRef.actionTable) ¬ UnKipperActionTable[unKipperer]; } ELSE ParserTableBodyRef ¬ NARROW[refAny]; }; KipperActionCell: PUBLIC PROC [ kipperer: Kipperer, ActionCellVal: ActionCell ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; IF ( KipperRef[kipperer, ActionCellVal] ) THEN { InternalPut16[kipperer, @(ActionCellVal.state)]; InternalPut16[kipperer, @(ActionCellVal.terminal)]; word ¬ ORD[(ActionCellVal.action)]; InternalPut16[kipperer, @(word)]; InternalPut16[kipperer, @(ActionCellVal.nextState)]; InternalPut16[kipperer, @(ActionCellVal.ruleNumber)]; InternalPut16[kipperer, @(ActionCellVal.leftSide)]; InternalPut16[kipperer, @(ActionCellVal.ruleSize)]; KipperActionCell[kipperer, (ActionCellVal.next)]; }; }; UnKipperActionCell: PUBLIC PROC [ unKipperer: UnKipperer ] RETURNS [ ActionCellVal: ActionCell ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; [flag, refAny] ¬ UnKipperRef[unKipperer]; IF ( flag ) THEN { refAny ¬ NEW[ActionCellBody]; RecordUnKipperedRef[unKipperer, refAny]; ActionCellVal ¬ NARROW[refAny]; InternalGet16[unKipperer, @(ActionCellVal.state)]; InternalGet16[unKipperer, @(ActionCellVal.terminal)]; InternalGet16[unKipperer, @(word)]; (ActionCellVal.action) ¬ VAL[word]; InternalGet16[unKipperer, @(ActionCellVal.nextState)]; InternalGet16[unKipperer, @(ActionCellVal.ruleNumber)]; InternalGet16[unKipperer, @(ActionCellVal.leftSide)]; InternalGet16[unKipperer, @(ActionCellVal.ruleSize)]; (ActionCellVal.next) ¬ UnKipperActionCell[unKipperer]; } ELSE ActionCellVal ¬ NARROW[refAny]; }; KipperActionTable: PUBLIC PROC [ kipperer: Kipperer, ActionTableVal: ActionTable ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; IF ( KipperRef[kipperer, ActionTableVal] ) THEN { count: CARD16 ¬ ActionTableVal.nSlots; InternalPut16[kipperer, @(count)]; FOR i: CARD16 IN[0..(ActionTableVal.nSlots)) DO KipperActionCell[kipperer, (ActionTableVal.actions[i])]; ENDLOOP; }; }; UnKipperActionTable: PUBLIC PROC [ unKipperer: UnKipperer ] RETURNS [ ActionTableVal: ActionTable ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; [flag, refAny] ¬ UnKipperRef[unKipperer]; IF ( flag ) THEN { count: CARD16; InternalGet16[unKipperer, @(count)]; refAny ¬ NEW[ActionTableBody[count]]; RecordUnKipperedRef[unKipperer, refAny]; ActionTableVal ¬ NARROW[refAny]; FOR i: CARD16 IN[0..(ActionTableVal.nSlots)) DO (ActionTableVal.actions[i]) ¬ UnKipperActionCell[unKipperer]; ENDLOOP; } ELSE ActionTableVal ¬ NARROW[refAny]; }; KipperTokenCell: PUBLIC PROC [ kipperer: Kipperer, TokenCellVal: TokenCell ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; IF ( KipperRef[kipperer, TokenCellVal] ) THEN { KipperRope[kipperer, (TokenCellVal.name)]; InternalPut16[kipperer, @(TokenCellVal.symbolCode)]; word ¬ ORD[(TokenCellVal.kind)]; InternalPut16[kipperer, @(word)]; KipperRope[kipperer, (TokenCellVal.spelling)]; word ¬ ORD[(TokenCellVal.case)]; InternalPut16[kipperer, @(word)]; KipperTokenCell[kipperer, (TokenCellVal.next)]; }; }; UnKipperTokenCell: PUBLIC PROC [ unKipperer: UnKipperer ] RETURNS [ TokenCellVal: TokenCell ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; [flag, refAny] ¬ UnKipperRef[unKipperer]; IF ( flag ) THEN { refAny ¬ NEW[TokenCellBody]; RecordUnKipperedRef[unKipperer, refAny]; TokenCellVal ¬ NARROW[refAny]; (TokenCellVal.name)¬ UnKipperRope[unKipperer]; InternalGet16[unKipperer, @(TokenCellVal.symbolCode)]; InternalGet16[unKipperer, @(word)]; (TokenCellVal.kind) ¬ VAL[word]; (TokenCellVal.spelling)¬ UnKipperRope[unKipperer]; InternalGet16[unKipperer, @(word)]; (TokenCellVal.case) ¬ VAL[word]; (TokenCellVal.next) ¬ UnKipperTokenCell[unKipperer]; } ELSE TokenCellVal ¬ NARROW[refAny]; }; KipperTokenTable: PUBLIC PROC [ kipperer: Kipperer, TokenTableVal: TokenTable ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; IF ( KipperRef[kipperer, TokenTableVal] ) THEN { count: CARD16 ¬ TokenTableVal.nSlots; InternalPut16[kipperer, @(count)]; KipperTokenCell[kipperer, (TokenTableVal.idToken)]; FOR i: CARD16 IN[0..(TokenTableVal.nSlots)) DO KipperTokenCell[kipperer, (TokenTableVal.tokens[i])]; ENDLOOP; }; }; UnKipperTokenTable: PUBLIC PROC [ unKipperer: UnKipperer ] RETURNS [ TokenTableVal: TokenTable ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; [flag, refAny] ¬ UnKipperRef[unKipperer]; IF ( flag ) THEN { count: CARD16; InternalGet16[unKipperer, @(count)]; refAny ¬ NEW[TokenTableBody[count]]; RecordUnKipperedRef[unKipperer, refAny]; TokenTableVal ¬ NARROW[refAny]; (TokenTableVal.idToken) ¬ UnKipperTokenCell[unKipperer]; FOR i: CARD16 IN[0..(TokenTableVal.nSlots)) DO (TokenTableVal.tokens[i]) ¬ UnKipperTokenCell[unKipperer]; ENDLOOP; } ELSE TokenTableVal ¬ NARROW[refAny]; }; KipperSymbolCell: PUBLIC PROC [ kipperer: Kipperer, SymbolCellVal: SymbolCell ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; IF ( KipperRef[kipperer, SymbolCellVal] ) THEN { KipperRope[kipperer, (SymbolCellVal.name)]; InternalPut16[kipperer, @(SymbolCellVal.code)]; KipperSymbolCell[kipperer, (SymbolCellVal.next)]; }; }; UnKipperSymbolCell: PUBLIC PROC [ unKipperer: UnKipperer ] RETURNS [ SymbolCellVal: SymbolCell ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; [flag, refAny] ¬ UnKipperRef[unKipperer]; IF ( flag ) THEN { refAny ¬ NEW[SymbolCellBody]; RecordUnKipperedRef[unKipperer, refAny]; SymbolCellVal ¬ NARROW[refAny]; (SymbolCellVal.name)¬ UnKipperRope[unKipperer]; InternalGet16[unKipperer, @(SymbolCellVal.code)]; (SymbolCellVal.next) ¬ UnKipperSymbolCell[unKipperer]; } ELSE SymbolCellVal ¬ NARROW[refAny]; }; KipperSymbolTable: PUBLIC PROC [ kipperer: Kipperer, SymbolTableVal: SymbolTable ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; IF ( KipperRef[kipperer, SymbolTableVal] ) THEN { count: CARD16 ¬ SymbolTableVal.nSlots; InternalPut16[kipperer, @(count)]; FOR i: CARD16 IN[0..(SymbolTableVal.nSlots)) DO KipperSymbolCell[kipperer, (SymbolTableVal.symbols[i])]; ENDLOOP; }; }; UnKipperSymbolTable: PUBLIC PROC [ unKipperer: UnKipperer ] RETURNS [ SymbolTableVal: SymbolTable ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; [flag, refAny] ¬ UnKipperRef[unKipperer]; IF ( flag ) THEN { count: CARD16; InternalGet16[unKipperer, @(count)]; refAny ¬ NEW[SymbolTableBody[count]]; RecordUnKipperedRef[unKipperer, refAny]; SymbolTableVal ¬ NARROW[refAny]; FOR i: CARD16 IN[0..(SymbolTableVal.nSlots)) DO (SymbolTableVal.symbols[i]) ¬ UnKipperSymbolCell[unKipperer]; ENDLOOP; } ELSE SymbolTableVal ¬ NARROW[refAny]; }; KipperParserTable: PUBLIC PROC [ kipperer: Kipperer, ParserTableVal: ParserTable ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; IF ( KipperRef[kipperer, ParserTableVal] ) THEN { KipperSymbolCell[kipperer, (ParserTableVal.unAnalyzedSymbols)]; InternalPut16[kipperer, @(ParserTableVal.nSymbols)]; KipperTokenCell[kipperer, (ParserTableVal.unAnalyzedTokens)]; InternalPut16[kipperer, @(ParserTableVal.nTokens)]; KipperActionCell[kipperer, (ParserTableVal.unAnalyzedActions)]; InternalPut16[kipperer, @(ParserTableVal.nActions)]; InternalPut16[kipperer, @(ParserTableVal.startState)]; KipperSymbolTable[kipperer, (ParserTableVal.symbolTable)]; KipperTokenTable[kipperer, (ParserTableVal.tokenTable)]; KipperActionTable[kipperer, (ParserTableVal.actionTable)]; }; }; UnKipperParserTable: PUBLIC PROC [ unKipperer: UnKipperer ] RETURNS [ ParserTableVal: ParserTable ] ~ TRUSTED { word: CARD16 ¬ 0; doubleWord: CARD32 ¬ 0; refAny: REF ¬ NIL; flag: BOOL ¬ FALSE; [flag, refAny] ¬ UnKipperRef[unKipperer]; IF ( flag ) THEN { refAny ¬ NEW[ParserTableBody]; RecordUnKipperedRef[unKipperer, refAny]; ParserTableVal ¬ NARROW[refAny]; (ParserTableVal.unAnalyzedSymbols) ¬ UnKipperSymbolCell[unKipperer]; InternalGet16[unKipperer, @(ParserTableVal.nSymbols)]; (ParserTableVal.unAnalyzedTokens) ¬ UnKipperTokenCell[unKipperer]; InternalGet16[unKipperer, @(ParserTableVal.nTokens)]; (ParserTableVal.unAnalyzedActions) ¬ UnKipperActionCell[unKipperer]; InternalGet16[unKipperer, @(ParserTableVal.nActions)]; InternalGet16[unKipperer, @(ParserTableVal.startState)]; (ParserTableVal.symbolTable) ¬ UnKipperSymbolTable[unKipperer]; (ParserTableVal.tokenTable) ¬ UnKipperTokenTable[unKipperer]; (ParserTableVal.actionTable) ¬ UnKipperActionTable[unKipperer]; } ELSE ParserTableVal ¬ NARROW[refAny]; }; }.