<> <> <> <> <> DIRECTORY Basics, ISBinding, ISToken, ISNode, IO USING [STREAM], Rope; ISScan: CEDAR DEFINITIONS = BEGIN ParseFailureReason: TYPE = { unsupportedConstruct, unexpectedDelimiter, hitEndOfScript, outOfPlaceConstruct, bindingAbsent, bindingWrongType, spare }; ParseFailure: SIGNAL [s: ScanHandle, r: ParseFailureReason]; ScanState: TYPE = {null, inProgress, complete, failed}; ScanStreamFlavor: TYPE = {characters, tokens}; bufferBytes: CARDINAL = 4; Buffer: TYPE = PACKED ARRAY [0..bufferBytes) OF Basics.Byte; <> ScanStream: TYPE = RECORD [ name: ATOM _ NIL, pushed: REF ScanStream _ NIL, token: ISToken.TVHandle _ NIL, body: SELECT type: ScanStreamFlavor FROM characters => [ cstream: IO.STREAM _ NIL, inString: BOOLEAN _ FALSE], tokens => [ tokenList: ISToken.TVHandle _ NIL], ENDCASE _ NULL]; CharactersScanner: TYPE = REF characters ScanStream; TokensScanner: TYPE = REF tokens ScanStream; ScanObject: TYPE = RECORD [ scanState: ScanState _ null, <> bindingStack: ISBinding.StackHandle, zoneIsScans, stackIsScans: BOOLEAN _ FALSE, family: ATOM _ NIL, stream: REF ScanStream ]; <<<>>> ScanHandle: TYPE = REF ScanObject; CreateScan: PROCEDURE [ base: Rope.ROPE, index: INT, <> bindingStack: ISBinding.StackHandle _ NIL, family: ATOM _ NIL ] RETURNS [ScanHandle]; PushScan: PROCEDURE [ScanHandle, Rope.ROPE, ATOM]; PopScan: PROCEDURE [ScanHandle]; InitializeScan: PROCEDURE [ScanHandle]; InitializeScanThroughCurly: PROCEDURE [ScanHandle]; <> AdvanceScan: PROCEDURE [ScanHandle]; <> CollectNode: PROCEDURE [scan: ScanHandle, parent: ISNode.Handle _ NIL, bound: BOOL _ FALSE] RETURNS [ISToken.NodeTVHandle]; END.