DIRECTORY ProcessExtras USING [CheckForAbort], AMTypes USING[TV], AMBridge USING[TVForReferent], PrintTV USING[Print], Rope USING [ROPE], IO USING [STREAM, PutF, rope, char, int], FS USING [Error, StreamOpen], Commander USING [CommandProc, Register, Handle], CommandTool USING [ArgumentVector, StarExpansion, Parse, Failed], RussellInterp USING [ICExp, ErrMsgProc, RussellParse, RTValue, RTTuple, RussellEval, RussellMkInitEnv] ; RussellRun: CEDAR PROGRAM IMPORTS ProcessExtras, AMBridge, PrintTV, IO, FS, Commander, CommandTool, RussellInterp = BEGIN usageMsg: Rope.ROPE _ "Usage: RussellRun fileName\nCompile and interpret Russell84 program.\n"; CompileAndExecute: Commander.CommandProc = BEGIN argv: CommandTool.ArgumentVector; CommandTool.StarExpansion[cmd ! CommandTool.Failed => { msg _ errorMsg; GOTO FailCmd }]; argv _ CommandTool.Parse[cmd ! CommandTool.Failed => { msg _ errorMsg; GOTO FailCmd }]; IF argv = NIL THEN { msg _ "mysterious NIL argv"; GOTO FailCmd } ; ProcessExtras.CheckForAbort[]; BEGIN inputStream: IO.STREAM; errorCount: INT _ 0; warningCount: INT _ 0; parseTree: RussellInterp.ICExp; initialEnvironment: RussellInterp.RTTuple; resultOfExecution: RussellInterp.RTValue; errMsgProc: RussellInterp.ErrMsgProc = BEGIN severityChar: CHAR; ProcessExtras.CheckForAbort[]; IF severe THEN { severityChar _ 'E; errorCount _ errorCount + 1 } ELSE { severityChar _ 'W; warningCount _ warningCount + 1 }; cmd.out.PutF[ "%g %g: %g\n", IO.char[severityChar], IO.int[errPos], IO.rope[msg]]; END ; -- errMsgProc IF (argv.argc > 2) THEN { msg _ usageMsg; GOTO FailCmd } ; cmd.out.PutF[ "Compiling %g:\n", IO.rope[argv[1]] ]; ProcessExtras.CheckForAbort[]; IF argv.argc = 1 THEN inputStream _ cmd.in ELSE inputStream _ FS.StreamOpen[ fileName~argv[1] ! FS.Error => { msg _ "Cannot open source file.\n"; GOTO FailCmd }]; parseTree _ RussellInterp.RussellParse[ source~inputStream, errMsgProc~errMsgProc]; cmd.out.PutF[ "%g errors, %g warnings.\n", IO.int[errorCount], IO.int[warningCount] ]; IF errorCount > 0 THEN { msg _ "ERRORS in source.\n"; GOTO ExitCmd }; cmd.out.PutF[ "Beginning execution:\n"]; ProcessExtras.CheckForAbort[]; initialEnvironment _ RussellInterp.RussellMkInitEnv[ in~cmd.in, out~cmd.out]; ProcessExtras.CheckForAbort[]; resultOfExecution _ RussellInterp.RussellEval[ env~initialEnvironment, ip~parseTree]; TRUSTED BEGIN resultTV: AMTypes.TV _ AMBridge.TVForReferent[ ref~resultOfExecution]; cmd.out.PutF[ "\nResult of execution:\n"]; PrintTV.Print[ tv~resultTV, put~cmd.out, depth~10, verbose~TRUE ]; cmd.out.PutF[ "\n\n"]; END ; { msg _ "Execution done.\n"; GOTO ExitCmd } END ; EXITS FailCmd => result _ $Failure ; ExitCmd => result _ NIL ; END ; -- CompileAndExecute Commander.Register[ key~"///Commands/RussellRun", proc~CompileAndExecute, doc~usageMsg, clientData~NIL ]; END . *RussellRun.mesa This is a batch batch user interface for the RussellInterp Russell84 interpreter interface. Last Edited by: Demers, March 19, 1984 12:43:28 pm PST [cmd: Commander.Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL] [errPos: INT, errMsg: Rope.ROPE, severe: BOOL _ TRUE] Κ]– "Cedar" style˜head1™Ibodyšœ[™[L™6unitšΟk ˜ Icodešœœ˜$Nšœœœ˜Nšœ œ˜Nšœœ˜Nšœœœ˜Nšœœœ˜)Nšœœ˜Nšœ œ!˜0Nšœ œ0˜ANšœœS˜fNšœ˜—šΟn œ ˜Nšœ#œœ'˜Wšœ˜MšœœL˜_šžœ˜(Jš œœ œœ œœ™Išœ˜Jšœ!˜!šœ˜Jšœ*œ ˜:—šœ˜Jšœ*œ ˜:—J˜šœœ˜Jšœœ ˜/—J˜š˜Jšœ œœ˜Jšœ œ˜Jšœœ˜Jšœ˜Jšœ*˜*Jšœ)˜)šž œ˜$Jš œ œœ œœ™5šœ˜Nšœœ˜J˜šœ˜ Nšœ3˜7Nšœ8˜<—Nšœœ$œ ˜RNšœΟc ˜——šœ˜Nšœœ ˜"—Nšœ!œ˜4J˜šœ˜Nšœ˜šœœ˜2Jšœœ0œ ˜D——NšœS˜SNšœ+œœ˜Všœ˜Nšœœ ˜.—Nšœ(˜(J˜NšœM˜MJ˜NšœU˜Ušœ˜ šœœ˜Nšœ/˜/—N˜*Nšœ;œ˜BN˜Nšœ˜—Jšœœ ˜+Nš˜—š˜Nšœ˜Nšœœ˜—NšœŸ˜——Mšœcœ˜iMšœ˜————…— ‡