HerculesParseViewerImpl

Edited by: Stolfi, February 22, 1984 12:30 pm

Was OldParseWindowImpl.mes
Coded by GNelson, September 6, 1982 12:26 am
Last Edited by: Gnelson, January 17, 1984 11:56 am
DIRECTORY
Atom,
HerculesParseViewer,
HerculesAlgebra,
HerculesParseUnparse,
ViewerClasses,
Rope,
TiogaOps,
IO;

HerculesParseViewerImpl: PROGRAM
IMPORTS
HerculesParseUnparse,
HerculesAlgebra,
Rope,
TiogaOps,
Atom,
IO
EXPORTS
HerculesParseViewer =

BEGIN
OPEN HerculesParseViewer, Par: HerculesParseUnparse, Alg: HerculesAlgebra;

ROPE: TYPE = Rope.ROPE;

NewViewer: PUBLIC PROC RETURNS [v: Viewer] =

BEGIN
???
END;

TiogaNode: TYPE = TiogaOps.Ref;

AddText: PUBLIC PROC[v: Viewer, text: ROPE] =

BEGIN
nd: TiogaNode ← TiogaOps.LastWithin[TiogaOps.ViewerDoc[v]];

Foo: SAFE PROC[root: TiogaOps.Ref] = CHECKED

BEGIN
TiogaOps.SelectNodes[v, nd, nd, node, FALSE];
TiogaOps.Break[];
TiogaOps.InsertRope[text];
END;

TiogaOps.CallWithLocks[Foo, TiogaOps.ViewerDoc[v]]
END;

AddTree: PUBLIC PROC[v: Viewer, expr: Se] =

BEGIN
r: ROPE ← Unparser.Unparse[LIST[tree], NIL, 57, pw.ph.table, 0];
End: PROC[r: ROPE] RETURNS [e: INT] = {
ee: INT ← r.SkipTo[0, ":"];
e ← r.SkipTo[0, "\n"];
IF e = r.Length THEN r ← Rope.Cat[r, "\n"];
IF ee < e THEN e ← ee};
endOfHeader: INT = End[r];
firstLine: Rope.ROPE = r.Substr[0, endOfHeader];
restOfLines: Rope.ROPE =
IF r.Fetch[endOfHeader] = ':
THEN r.Substr[endOfHeader]
ELSE r.Substr[endOfHeader + 1];
AddText[v, Par.UnParse[expr, Syn.junoSyntax, 3, 57]]
END;

Next: PROC[n:TiogaNode] RETURNS [TiogaNode] = {RETURN[TiogaOps.Next[n]]};

FirstChild: PROC[n:TiogaNode] RETURNS [TiogaNode] = {RETURN[TiogaOps.FirstChild[n]]};

GetRope: PROC[n:TiogaNode] RETURNS [ROPE] = {RETURN[TiogaOps.GetRope[n]]};

ParseViewer: PUBLIC PROC [pw: Handle] =

BEGIN
newContent: LIST OF NodeContent ← NIL;
n: TiogaNode ← TiogaOps.FirstChild[TiogaOps.ViewerDoc[pw.viewer]];
success: BOOLTRUE;
tree: REF;
text1: ROPE;
text2: ROPE;
pw.contentValid ← TRUE;
WHILE success AND n # NIL DO
[success, tree, text1, text2] ← PN2[n, pw];
IF success THEN newContent ← CONS[[text1, text2, tree], newContent];
n ← TiogaOps.Next[n];
ENDLOOP;
pw.contentValid ← success;
IF success THEN pw.content ← newContent ELSE pw.content ← AppendNodeContentList[newContent, pw.content]
END;

ParseUnparseNode: PROC [n: TiogaNode, pv: PViewer]
RETURNS [success: BOOL, expr: Se, text: ROPE] =

BEGIN
r: Rope.ROPE;
vc: VerdictAndCulprit;
errorMessage: ROPENIL;
text ← TiogaOps.GetRope[n];
-- next three lines try to skip parsing if old parsed result is present in pw.contents:
{l: LIST OF ROPE ← pv.oldContents;
WHILE l # NIL AND NOT(Rope.Equal[l.first, text]) DO l ← l.rest ENDLOOP;
IF l # NIL THEN
{success ← TRUE; expr ← l.first.expr; text ← l.first.text; RETURN} };
IF ~ pv.contentValid THEN RETURN;
[expr, error, rest] ← Par.Parse[text];
IF error = NIL AND rest = NIL THEN {vc ← pw.WellFormed[pw.ph.result];
IF vc.verdict # Yes
THEN errorMessage ← "Not a WFF"
ELSE {vc.culprit ← NIL; errorMessage ← NIL}}
ELSE {vc.culprit ← NIL;
errorMessage ← IF pw.ph.error # NIL THEN pw.ph.error ELSE "Bad Syntax"};

r ← Unparser.Unparse[pw.ph.result, vc.culprit, 57, pw.ph.table, pw.ph.openCount];
--! change "57" to "width of window"
tree ← NARROW[pw.ph.result, LIST OF REF ANY].first;
IF pw.ph.error # NIL OR ~pw.ph.eof
THEN {r ← Rope.Cat[r, " \000", Rope.FromRefText[pw.ph.in.buf], "\000"];
WHILE ~ IO.EndOf[pw.ph.in.in]
DO r ← Rope.Cat[r, Rope.FromChar[IO.GetChar[pw.ph.in.in]]]
ENDLOOP};
{i: INT ← r.SkipTo[0, "\000"];
j: INT;
endOfHeader: INT = r.SkipTo[0, "\n"];
firstLine: Rope.ROPE = r.Substr[0, endOfHeader];
restOfLines: Rope.ROPE =
IF endOfHeader = r.Length THEN NIL ELSE r.Substr[endOfHeader + 1];
Foo: SAFE PROC[root: TiogaOps.Ref] = TRUSTED
{m: TiogaNode = IF TiogaOps.FirstChild[n] = NIL THEN n ELSE TiogaOps.FirstChild[n];
TiogaOps.SelectNodes[viewer: pw.viewer, start:n, end:m, pendingDelete: TRUE, level:char];
IF i = r.Length[]
THEN {TiogaOps.InsertRope[firstLine];
TiogaOps.Break[];
TiogaOps.Nest[];
TiogaOps.InsertRope[restOfLines]}
ELSE {j ← r.SkipTo[i + 1, "\000"];
TiogaOps.InsertRope[Rope.Cat[r.Substr[0, i], r.Substr[i+1, j - i - 1], r.Substr[j+1]]];
TiogaOps.SetSelection[pw.viewer, [n, i], [n, j - 1]]}};
TiogaOps.CallWithLocks[Foo, TiogaOps.ViewerDoc[pw.viewer]];
success ← (errorMessage = NIL);
text1 ← firstLine;
text2 ← restOfLines}
END;

END.