home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / jËzyki_programowania / oberon / system1 / exprsubstituter.mod (.txt) < prev    next >
Oberon Text  |  1977-12-31  |  2KB  |  60 lines

  1. Syntax10.Scn.Fnt
  2. Syntax10i.Scn.Fnt
  3. StampElems
  4. Alloc
  5. 20 Apr 95
  6. Syntax10b.Scn.Fnt
  7. MODULE ExprSubstituter; (* ww 
  8.     IMPORT
  9.         Texts, Oberon, Expressions, ExprViews, ExprIcons;
  10.     PROCEDURE Subst(VAR exp: Expressions.Expression; from, to: Expressions.Expression; s: Expressions.UnificationScope);
  11.         VAR l: Expressions.List; e: Expressions.Expression; r: Expressions.Rider;
  12.     BEGIN
  13.         e := exp; Expressions.Normalize(e, s);
  14.         IF Expressions.Equal(e, from) THEN exp := to
  15.         ELSE
  16.             Expressions.OpenRider(r, exp.successors);
  17.             WHILE ~r.eol DO
  18.                 e := r.exp; Subst(e, from, to, s);
  19.                 IF e # r.exp THEN Expressions.Change(r, e, r.attr) END;
  20.                 Expressions.Forward(r)
  21.             END;
  22.             l := Expressions.ThisList(r);
  23.             IF l # exp.successors THEN exp := Expressions.CloneOf(exp, l) END
  24.         END
  25.     END Subst;
  26.     PROCEDURE ReadPar(VAR from, to: Expressions.Expression);
  27.         VAR beg, end, d, pos: LONGINT; ch: CHAR; eot: BOOLEAN; t: Texts.Text; r: Texts.Reader;
  28.     BEGIN
  29.         to := NIL;
  30.         t := Oberon.Par.text; pos := Oberon.Par.pos;
  31.         Texts.OpenReader(r, t, pos); Texts.Read(r, ch);
  32.         WHILE ~r.eot & (ch # "=") DO Texts.Read(r, ch) END;
  33.         IF ~r.eot THEN Texts.Read(r, ch) END;
  34.         WHILE ~r.eot & (ch # ">") DO
  35.             WHILE ~r.eot & (ch # "=") DO Texts.Read(r, ch) END;
  36.             IF ~r.eot THEN Texts.Read(r, ch) END
  37.         END;
  38.         IF ~r.eot THEN
  39.             beg := pos; end := Texts.Pos(r) - 2;
  40.             ExprIcons.defaultConverter.read(ExprIcons.defaultConverter, ExprIcons.LogError, t, beg, end, d, eot, from);
  41.             IF from # NIL THEN
  42.                 beg := Texts.Pos(r); end := t.len;
  43.                 ExprIcons.defaultConverter.read(ExprIcons.defaultConverter, ExprIcons.LogError, t, beg, end, d, eot, to)
  44.             END
  45.         END
  46.     END ReadPar;
  47.     PROCEDURE Substitute*;
  48.         VAR sel: ExprViews.Selection; from, to: Expressions.Expression; s: Expressions.UnificationScope;
  49.     BEGIN
  50.         ReadPar(from, to);
  51.         sel := ExprViews.LatestSelection();
  52.         IF (to # NIL) & (sel # NIL) & ~sel.promise THEN
  53.             s := Expressions.NewUnificationScope();
  54.             Expressions.Normalize(from, s); Expressions.Normalize(to, s);
  55.             Subst(sel.exp, from, to, s);
  56.             sel.notify(sel, sel)
  57.         END
  58.     END Substitute;
  59. END ExprSubstituter.
  60.