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: BOOL ← TRUE;
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: ROPE ← NIL;
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.