-- SMControlImpl.mesa -- last edit by Schmidt, July 2, 1982 11:35 am -- last edit by Satterthwaite, May 27, 1983 10:54 am DIRECTORY IO: TYPE USING [GetChar, GetSequence, Handle, Put, string], Process: TYPE USING [Detach], Rope: TYPE USING [Cat, Length, ROPE], SMEval: TYPE USING [Eval], SMOps: TYPE USING [MS, NewModel], SMUtil: TYPE USING [ParseStream, PrettyPrint, PrintTree], SMTree: TYPE Tree USING [Link, null], SMTreeOps: TYPE --TreeOps-- USING [Initialize, Finalize], TypeScript: TYPE USING [Create, TS--, UserAbort--], ViewerIO: TYPE USING [CreateViewerStreams]; SMControlImpl: CEDAR PROGRAM IMPORTS IO, Process, Rope, SMEval, SMOps, SMUtil, SMTreeOps, TypeScript, ViewerIO ~ { OPEN Tree~~SMTree, TreeOps~~SMTreeOps; -- mds usage model: SMOps.MS; -- end of mds debugLevel: NAT ← NAT.LAST; -- <= 1: parse trees -- <= 2: id lookup -- no debugging is default Main: PROC ~ { ENABLE ABORTED => {GOTO out}; cycle: BOOL ← TRUE; line, val: Rope.ROPE; in, out: IO.Handle; ts: TypeScript.TS ~ TypeScript.Create[info~[name~"SMInterpreter.Log", iconic~FALSE]]; [in, out] ← ViewerIO.CreateViewerStreams[viewer~ts, name~NIL]; model ← SMOps.NewModel[in, out, out]; (model.tm).Initialize; WHILE cycle DO -- IF TypeScript.UserAbort[model.typeScript] THEN EXIT; model.out.Put[IO.string["\n\n\n? "L]]; val ← NIL; DO -- IF TypeScript.UserAbort[model.typeScript] THEN EXIT; line ← (model.in).GetSequence; [] ← (model.in).GetChar; -- discard '\n IF line.Length = 0 THEN EXIT; val ← Rope.Cat[val, "\n", line]; ENDLOOP; model.topTree ← SMUtil.ParseStream[m~model, source~val, pretty~FALSE, times~FALSE, debug~FALSE]; IF model.topTree # Tree.null THEN { IF debugLevel <= 1 THEN SMUtil.PrintTree[model, model.topTree]; SMUtil.PrettyPrint[model, model.topTree]}; IF model.topTree # Tree.null THEN { val: Tree.Link ← SMEval.Eval[model, model.topTree, NIL]; model.out.Put[IO.string["\n\n"L]]; IF debugLevel <= 2 THEN SMUtil.PrintTree[model, val]; SMUtil.PrettyPrint[model, val]}; ENDLOOP; (model.tm).Finalize; EXITS out => NULL; }; Init: PROC ~ TRUSTED {Process.Detach[FORK Main[]]}; Init[]; }.