-- SymbolTester.mesa last modified: Bruce April 21, 1980 2:08 PM DIRECTORY CompilerUtil: FROM "compilerutil", Commands: FROM "commands", DContext: FROM "Dcontext", DebugOps: FROM "debugops", DOutput: FROM "doutput" USING [Char, EOL, Text], DSyms: FROM "dsyms" USING [Initialize], Heap: FROM "heap", ImageDefs: FROM "imagedefs" USING [StopMesa], Init: FROM "init", IODefs: FROM "iodefs" USING [ReadLine], Lookup: FROM "lookup", MiscDefs: FROM "miscdefs" USING [DestroyFakeModule], Mopcodes: FROM "mopcodes" USING [zPOP, zR0, zW0], SegmentDefs: FROM "segmentdefs", State: FROM "state" USING [Go, OnYourMark], StringDefs: FROM "stringdefs" USING [EquivalentString]; SymbolTester: PROGRAM IMPORTS DContext, CompilerUtil, DebugOps, DOutput, DSyms, Heap, ImageDefs, Init, IODefs, MiscDefs, State, StringDefs EXPORTS CompilerUtil, Commands, DebugOps = BEGIN DispatchChar: PUBLIC PROC [c: CHARACTER] = {DOutput.Char[c]}; TableSegment: PUBLIC PROCEDURE [id: CompilerUtil.TableId] RETURNS [seg: SegmentDefs.FileSegmentHandle] = BEGIN OPEN CompilerUtil, Init; offset: CARDINAL; [seg, offset] ← MiscDefs.DestroyFakeModule[SELECT id FROM parse => LOOPHOLE[DIGrammar], debug => LOOPHOLE[DebugTab], ENDCASE => ERROR]; IF offset # 0 THEN ERROR; RETURN[seg]; END; Lengthen: PUBLIC PROC [p: POINTER] RETURNS [LONG POINTER] ={RETURN[p]}; LongREAD: PUBLIC PROCEDURE [loc: LONG POINTER] RETURNS [val: UNSPECIFIED] = BEGIN OPEN Mopcodes; ReadMem: PROCEDURE [LONG POINTER] RETURNS [UNSPECIFIED] = MACHINE CODE BEGIN zPOP; zR0 END; val ← ReadMem[loc]; END; LongCopyREAD: PUBLIC PROC [ from: LONG POINTER, nwords: CARDINAL, to: LONG POINTER] = BEGIN i: CARDINAL; FOR i IN [0..nwords) DO (to+i)↑ ← LongREAD[from+i]; ENDLOOP; END; LongWRITE: PUBLIC PROC [loc: LONG POINTER, val: UNSPECIFIED] = BEGIN OPEN Mopcodes; WriteMem: PROC [UNSPECIFIED, LONG POINTER] = MACHINE CODE BEGIN zPOP; zW0 END; WriteMem[val,loc]; END; LongCopyWRITE: PUBLIC PROC [ from: LONG POINTER, nwords: CARDINAL, to: LONG POINTER] = BEGIN i: CARDINAL; FOR i IN [0..nwords) DO LongWRITE[to+i, (from+i)↑]; ENDLOOP; END; Done: PROCEDURE RETURNS [BOOLEAN] = BEGIN OPEN StringDefs; SELECT TRUE FROM EquivalentString[s,"stop"L] => RETURN[TRUE]; EquivalentString[s,"quit"L] => RETURN[TRUE]; EquivalentString[s,"q"L] => RETURN[TRUE]; ENDCASE => RETURN[FALSE] END; CallSomething: PROCEDURE [s: STRING] RETURNS [BOOLEAN] = BEGIN OPEN StringDefs, CompilerUtil; SELECT TRUE FROM EquivalentString[s,"trees"L] => printTree ← ~printTree; EquivalentString[s,"bodies"L] => PrintBodies[]; EquivalentString[s,"symbols"L] => PrintSymbols[]; ENDCASE => RETURN[FALSE]; RETURN[TRUE]; END; s: STRING ← [100]; printTree: BOOLEAN ← TRUE; Error: PROC [type: {invalidNumber, notImpl, syntax, parse}] = BEGIN DOutput.Char[' ]; DOutput.Text[SELECT type FROM syntax => "Syntax error!"L, invalidNumber => "invalid number!"L, notImpl => "not implemented!"L, parse => "Parse error!"L, ENDCASE => ERROR]; DOutput.EOL[]; END; Show: PROCEDURE [f: DebugOps.Foo] = {DebugOps.Display[f]}; DoIt: PROCEDURE = BEGIN State.OnYourMark[]; State.Go[]; DSyms.Initialize[]; DContext.SetRootConfig["Test"L]; DContext.SetModule["Test"L]; DO s.length ← 0; DOutput.Text["Interpret: "L]; IODefs.ReadLine[s !ANY => CONTINUE]; IF CallSomething[s] THEN LOOP; IF Done[] THEN ImageDefs.StopMesa[]; DebugOps.Interpret[s, Show ! DebugOps.InvalidNumber => {Error[invalidNumber]; CONTINUE}; DebugOps.NotImplemented => BEGIN DOutput.Text[msg]; Error[notImpl]; CONTINUE END; DebugOps.SyntaxError => {Error[syntax]; CONTINUE}; DebugOps.ParseError => {Error[parse]; CONTINUE}]; Heap.FreeEverything[]; ENDLOOP; END; DoIt[]; END.