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. Ì 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 Ê˜šœ™šœ.™.šœ™Jšœ,™,Jšœ3™3———JšÏk œzœ˜†Jš œœœPœœ˜ĦšœœœHœœœÏn œœœœ˜›Jšœœœ˜—Jšœ œ˜ š œžœœœœ˜/Jšœœ>˜Dšœžœœœ˜0Jšœœ+œ:œ˜v—Jšœ6œ˜:—šœžœœœ˜,Jš'œ œœœžœœœœœœ9œœœœœœ3œ œ"œœY˜Ħ—Jš œžœœœœ˜JJš œž œœœœ˜VJš œžœœœœœ˜Kšœž œœœ˜(Jš-œœœœœRœœ œ œ œœœ œœœ6œ œœAœ!œ œœ<œ˜œ—š œžœœœ œœ˜fJš™œœ œ-œœ$ÏcXœœœœœœœœœ œœœœœ,œœœœ0œ œœœœ2œ œ*œœœœœœœœ œoŸ%œ œœœœœ œœœœPœœ"œœ&œ œœœ*œ3œ œœœœ žœœœœœœœœgœœœĦœ°œ7œ˜„—Jšœœ˜—…—HĦ