-- file SakuraReader.Mesa
-- last modified by Satterthwaite, January 12, 1981 4:55 PM
-- last edit by Russ Atkinson, 9-Jul-81 14:48:46
-- last edited by Suzuki: 30-Sep-81 11:33:04
DIRECTORY
CBinary: TYPE USING [MesaTab, DebugTab],
Convert: TYPE USING [MapValue],
IOStream: TYPE USING [Handle, PutChar],
PPCommentTable: TYPE USING [Reset],
SakuraOps: TYPE USING [TableId],
SakuraUtil: TYPE USING [PrettyPrint, PrintTree],
PPComData: TYPE USING [Init],
Runtime: TYPE USING [GetTableBase],
PPP1: TYPE USING [Parse],
ShowTime: TYPE USING [Microseconds, GetMark, Show],
SakuraCommon: TYPE USING [tty],
SakuraTree: TYPE USING [Link, Null],
SakuraTreeOps: TYPE USING [Finalize, Initialize, PopTree],
Rope: TYPE USING [Map, Ref],
TTY: TYPE USING [Handle, PutChar, PutCR];
SakuraReader: PROGRAM
IMPORTS
Convert, IOStream, ShowTime, P1: PPP1, SakuraCommon, TreeOps: SakuraTreeOps, PPComData,
CBinary, SakuraUtil, Runtime, CT: PPCommentTable, Rope, TTY
EXPORTS SakuraOps, SakuraUtil =
BEGIN OPEN Tree: SakuraTree;
-- Put routines
PutDecimal: PUBLIC PROC [st: IOStream.Handle, x: LONG INTEGER] = {
OPEN Convert, IOStream;
PC1: PROC [c: CHARACTER] = {PutChar[st, c]};
MapValue[PC1, [signed[x]]];
};
PutRope: PUBLIC PROC [st: IOStream.Handle, r: Rope.Ref] = {
OPEN IOStream, Rope;
PC2: PROC [c: CHARACTER] RETURNS [BOOLEAN] = {PutChar[st, c]; RETURN [FALSE]};
[] ← Map[base: r, action: PC2]};
-- stream management
Source: Rope.Ref ← NIL;
GetSource: PUBLIC PROC RETURNS [Rope.Ref] = {RETURN[Source]};
Log: IOStream.Handle ← NIL;
GetLog: PUBLIC PROC RETURNS [IOStream.Handle] = {RETURN[Log]};
SetLog: PUBLIC PROC [log: IOStream.Handle] = { Log ← log};
Microseconds: TYPE = ShowTime.Microseconds;
Report: PROC [from: Microseconds, msg: STRING ← NIL] = {
OPEN TTY;
Put1: PROC [c: CHARACTER] RETURNS [BOOLEAN] = {
PutChar[tty, c]; RETURN [FALSE]};
PutChar[tty, ' ];
PutChar[tty, ' ];
ShowTime.Show[from, Put1];
PutChar[tty, ':];
PutChar[tty, ' ];
IF msg # NIL THEN FOR i: CARDINAL IN [0..msg.length) DO
PutChar[tty, msg[i]]; ENDLOOP;
PutCR[tty]};
tty: TTY.Handle ← SakuraCommon.tty;
-- table segment management
TableHandle: PUBLIC TYPE = LONG POINTER;
tableSegment: ARRAY SakuraOps.TableId [parse..debug] OF TableHandle;
AcquireTable: PUBLIC PROC [id: SakuraOps.TableId] RETURNS [TableHandle] = {
RETURN [tableSegment[id]]};
ReleaseTable: PUBLIC PROC [id: SakuraOps.TableId] = {
};
-- compiler sequencing
ParseStream:
PUBLIC PROC
[source: Rope.Ref ← NIL, log: IOStream.Handle ← NIL,
pretty, times: BOOLEAN ← TRUE, debug: BOOLEAN ← FALSE]
RETURNS [root: Tree.Link] = {
start,mark: Microseconds ← ShowTime.GetMark[];
Source ← source;
Log ← log;
TreeOps.Initialize[];
CT.Reset[];
mark ← ShowTime.GetMark[];
{complete: BOOLEAN ← TRUE;
nTokens,nErrors: CARDINAL ← 0;
[complete, nTokens, nErrors] ← P1.Parse[];
root ← IF complete THEN TreeOps.PopTree[] ELSE Tree.Null;
IF times THEN
Report[mark, IF nErrors = 0 THEN "parsing" ELSE "parsing (errors)"]};
mark ← ShowTime.GetMark[];
IF debug THEN SakuraUtil.PrintTree[root];
IF pretty THEN
{SakuraUtil.PrettyPrint[root];
IF times THEN Report[mark, "output"];
mark ← ShowTime.GetMark[];
IF times THEN Report[start, "total time"]};
TreeOps.Finalize[];
Source ← NIL;
Log ← NIL};
-- initialization code
tableSegment[parse] ← Runtime.GetTableBase[LOOPHOLE[CBinary.MesaTab]];
tableSegment[debug] ← Runtime.GetTableBase[LOOPHOLE[CBinary.DebugTab]];
PPComData.Init[];
END.