Syntax10.Scn.Fnt Syntax10i.Scn.Fnt StampElems Alloc 20 Apr 95 Syntax10b.Scn.Fnt MODULE ExprSubstituter; (* ww IMPORT Texts, Oberon, Expressions, ExprViews, ExprIcons; PROCEDURE Subst(VAR exp: Expressions.Expression; from, to: Expressions.Expression; s: Expressions.UnificationScope); VAR l: Expressions.List; e: Expressions.Expression; r: Expressions.Rider; BEGIN e := exp; Expressions.Normalize(e, s); IF Expressions.Equal(e, from) THEN exp := to ELSE Expressions.OpenRider(r, exp.successors); WHILE ~r.eol DO e := r.exp; Subst(e, from, to, s); IF e # r.exp THEN Expressions.Change(r, e, r.attr) END; Expressions.Forward(r) END; l := Expressions.ThisList(r); IF l # exp.successors THEN exp := Expressions.CloneOf(exp, l) END END END Subst; PROCEDURE ReadPar(VAR from, to: Expressions.Expression); VAR beg, end, d, pos: LONGINT; ch: CHAR; eot: BOOLEAN; t: Texts.Text; r: Texts.Reader; BEGIN to := NIL; t := Oberon.Par.text; pos := Oberon.Par.pos; Texts.OpenReader(r, t, pos); Texts.Read(r, ch); WHILE ~r.eot & (ch # "=") DO Texts.Read(r, ch) END; IF ~r.eot THEN Texts.Read(r, ch) END; WHILE ~r.eot & (ch # ">") DO WHILE ~r.eot & (ch # "=") DO Texts.Read(r, ch) END; IF ~r.eot THEN Texts.Read(r, ch) END END; IF ~r.eot THEN beg := pos; end := Texts.Pos(r) - 2; ExprIcons.defaultConverter.read(ExprIcons.defaultConverter, ExprIcons.LogError, t, beg, end, d, eot, from); IF from # NIL THEN beg := Texts.Pos(r); end := t.len; ExprIcons.defaultConverter.read(ExprIcons.defaultConverter, ExprIcons.LogError, t, beg, end, d, eot, to) END END END ReadPar; PROCEDURE Substitute*; VAR sel: ExprViews.Selection; from, to: Expressions.Expression; s: Expressions.UnificationScope; BEGIN ReadPar(from, to); sel := ExprViews.LatestSelection(); IF (to # NIL) & (sel # NIL) & ~sel.promise THEN s := Expressions.NewUnificationScope(); Expressions.Normalize(from, s); Expressions.Normalize(to, s); Subst(sel.exp, from, to, s); sel.notify(sel, sel) END END Substitute; END ExprSubstituter.