DIRECTORY BasicTime USING [GMT, nullGMT], Convert USING [IntFromRope], FS USING [GetInfo, OpenFileFromStream, StreamOpen], IO USING [EndOfStream, GetCedarTokenRope, GetIndex, TokenKind, STREAM], RobotEvaluator USING [opOR, opAND, opNOT, opMOD, opLT, opEQ, opGT, opNE, opGE, opLE, opPlus, opMinus, opTimes, opDivide], RobotOpCodes USING [IsOpCode, OpCode], RobotScanner, --USING everything Rope USING [ROPE, Equal]; RobotScannerImpl: CEDAR PROGRAM IMPORTS Convert, FS, IO, RobotEvaluator, RobotOpCodes, Rope EXPORTS RobotScanner ~ { OPEN RobotScanner; GetTokensFromFile: PUBLIC PROC [file: Rope.ROPE] RETURNS [scannedProgram: ScannedProgram _ NEW[ScannedProgramRec]] ~ { OPEN RobotEvaluator, RobotOpCodes; prog: IO.STREAM _ NIL; cedarTokenKind: IO.TokenKind _ tokenID; tokenText: Rope.ROPE; idx: INT; --To contain an index into the file prog _ FS.StreamOpen[file]; scannedProgram.count _ 0; scannedProgram.token[scannedProgram.count] _ NEW[RTknRec _ [time, CreateTime[prog],0]]; scannedProgram.count _ scannedProgram.count + 1; DO [cedarTokenKind, tokenText] _ IO.GetCedarTokenRope[prog ! IO.EndOfStream => EXIT]; idx _ IO.GetIndex[prog]; scannedProgram.token[scannedProgram.count] _ NEW[RTknRec _ SELECT cedarTokenKind FROM tokenDECIMAL, tokenOCTAL, tokenHEX => [tknNum, REFIntFromRope[tokenText]], tokenID => SELECT TRUE FROM Rope.Equal[tokenText,"IF"] => [tknIF,NIL], Rope.Equal[tokenText,"THEN"] => [tknTHEN,NIL], Rope.Equal[tokenText,"ELSE"] => [tknELSE,NIL], Rope.Equal[tokenText,"OR"] => [tknOR, opOR], Rope.Equal[tokenText,"AND"] => [tknAND, opAND], Rope.Equal[tokenText,"NOT"] => [tknNOT, opNOT], Rope.Equal[tokenText,"MOD"] => [tknMulop, opMOD], IsOpCode[tokenText] => [tknInstruction, OpCode[tokenText]], ENDCASE => [tknID, tokenText], tokenSINGLE, tokenDOUBLE => SELECT TRUE FROM Rope.Equal[tokenText,"("] => [tknLParen, NIL], Rope.Equal[tokenText,")"] => [tknRParen, NIL], Rope.Equal[tokenText,"["] => [tknLBracket, NIL], Rope.Equal[tokenText,"]"] => [tknRBracket, NIL], Rope.Equal[tokenText,"^"] => [tknIndirect, NIL], Rope.Equal[tokenText,":"] => [tknColon, NIL], Rope.Equal[tokenText,";"] => [tknSemiColon, NIL], Rope.Equal[tokenText,","] => [tknComma, NIL], Rope.Equal[tokenText,"_"] => [tknAssign, NIL], Rope.Equal[tokenText,"<"] => [tknRelop, opLT], Rope.Equal[tokenText,"="] => [tknRelop, opEQ], Rope.Equal[tokenText,">"] => [tknRelop, opGT], Rope.Equal[tokenText,"+"] => [tknAddop, opPlus], Rope.Equal[tokenText,"-"] => [tknAddop, opMinus], Rope.Equal[tokenText,"*"] => [tknMulop, opTimes], Rope.Equal[tokenText,"/"] => [tknMulop, opDivide], Rope.Equal[tokenText,"~"] => [tknNOT, opNOT], Rope.Equal[tokenText,"#"] => [tknImmediate, NIL], Rope.Equal[tokenText,">="], Rope.Equal[tokenText, "~<"] => [tknRelop, opGE], Rope.Equal[tokenText,"<="], Rope.Equal[tokenText, "~>"] => [tknRelop, opLE], Rope.Equal[tokenText, "~="] => [tknRelop, opNE], ENDCASE => ERROR, tokenEOF => [tknEOF, NIL], --Never gets seen ENDCASE => ERROR ]; scannedProgram.token[scannedProgram.count].pc _ idx; scannedProgram.count _ scannedProgram.count + 1; ENDLOOP; scannedProgram.token[scannedProgram.count] _ NEW[RTknRec _ [tknEOF, NIL]]; }; CreateTime: PROC [s: IO.STREAM] RETURNS [t: REF BasicTime.GMT _ NEW[BasicTime.GMT _ BasicTime.nullGMT]] ~ { [created: t^] _ FS.GetInfo[FS.OpenFileFromStream[s]]; }; REFIntFromRope: PRIVATE PROC [rope: Rope.ROPE] RETURNS [int: REF INT] ~ { int _ NEW[INT]; int^ _ Convert.IntFromRope[rope]; }; }. ‚RobotScannerImpl.mesa Created Monday, May 21, 1984 12:03 pm PDT Last edited by Eric Nickell, June 10, 1984 0:24:16 am PDT Ês˜Jšœ™J™)J™9J™šÏk ˜ Jšœ œœ ˜Jšœœ˜Jšœœ+˜3Jšœœ7œ˜GJšœœe˜yJšœ œ˜&JšœÏc˜ Jšœœœ ˜—J˜šœœ˜Jšœ œœ$˜;Jšœ ˜Jšœ˜Jšœ˜J˜š Ïnœœœ œœ#œ˜vJšœ˜"Jšœœœœ˜Jšœœ˜'Jšœœ˜Jšœœž#˜0J˜Jšœœ˜J˜Jšœ-œœ˜WJ˜0š˜Jšœœœœ˜RJšœœ˜šœ-œ˜;šœ˜˜%Jšœ$˜$—šœ œœ˜Jšœ%œ˜*Jšœ)œ˜.Jšœ)œ˜.Jšœ,˜,Jšœ/˜/J˜/J˜1J˜;Jšœ˜—šœœœ˜,Jšœ)œ˜.Jšœ)œ˜.Jšœ+œ˜0Jšœ+œ˜0Jšœ+œ˜0Jšœ(œ˜-Jšœ,œ˜1Jšœ(œ˜-Jšœ)œ˜.Jšœ.˜.Jšœ.˜.Jšœ.˜.J˜0J˜1J˜1J˜2J˜-Jšœ,œ˜1J˜LJ˜LJ˜0Jšœœ˜—Jšœœž˜,Jšœ˜—J˜—Jšœ4˜4J˜0Jšœ˜Jšœ-œœ˜J—J˜J˜—šŸ œœœœœœ œœ œ˜kJšœœ œ˜5J˜J˜—šŸœœœ œœœœ˜IJšœœœ˜Jšœ!˜!J˜J˜—J˜——…— pe