arithmetic/src/basictypes/complex/ComplexFmtLex.mg


GENERIC MODULE ComplexFmtLex(R, RF);
Arithmetic for Modula-3, see doc for details

IMPORT Rd, Thread;
IMPORT Fmt AS F;
IMPORT Lex AS L;
IMPORT FloatMode;
IMPORT Arithmetic AS Arith;
IMPORT FmtLexSupport AS FSup;
FROM FmtLexSupport IMPORT Precedence;

<* UNUSED *>
CONST
  Module = "ComplexFmtLex.";

PROCEDURE Fmt (READONLY x: T; READONLY style := FmtStyle{}; ): TEXT =
  (**Generate in format "COMPLEX{re:=1.0,im:=2.0}"
     Uses simple F.Real if c.im=0.0.
     style and precision can be overridden*)
  VAR t: TEXT;
  BEGIN
    IF R.IsZero(x.im) THEN
      t := RF.Fmt(x.re, style.elemStyle);
    ELSE
      t := "Complex{re:=" & RF.Fmt(x.re, style.elemStyle) & "," & "im:="
             & RF.Fmt(x.im, style.elemStyle) & "}";
    END;
    RETURN t;
  END Fmt;

PROCEDURE Tex (READONLY x     : T;
               READONLY style       := TexStyle{};
                        within      := Precedence.Sum; ): TEXT =
  VAR t: TEXT;
  BEGIN
    IF R.IsZero(x.im) THEN
      t := RF.Tex(x.re, style.elemStyle, within);
    ELSIF R.IsZero(x.re) THEN
      t :=
        FSup.Parenthesize(RF.Tex(x.im, style.elemStyle, Precedence.Product)
                            & " i", Precedence.Product, within);
    ELSE
      t := FSup.Parenthesize(
             RF.Tex(x.re, style.elemStyle, Precedence.Sum) & " + "
               & RF.Tex(x.im, style.elemStyle, Precedence.Product) & " i",
             Precedence.Sum, within);
    END;
    RETURN t;
  END Tex;

PROCEDURE Lex (rd: Rd.T; READONLY style: LexStyle; ): T
  RAISES {L.Error, FloatMode.Trap, Rd.Failure, Thread.Alerted} =
  VAR z: T;
  BEGIN
    z.re := RF.Lex(rd);
    FSup.AssertChar(rd, style.sep);
    FSup.AssertChar(rd, 'i');
    z.im := RF.Lex(rd);
    RETURN z;
  END Lex;

BEGIN
END ComplexFmtLex.

interface FloatMode is in: