From 7aa1a24aa8de82700fee266ac0e716ff9846ab5e Mon Sep 17 00:00:00 2001 From: aarne Date: Tue, 4 Sep 2007 18:14:36 +0000 Subject: [PATCH] new precedence lib --- prelude/Formal.gf | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 prelude/Formal.gf diff --git a/prelude/Formal.gf b/prelude/Formal.gf new file mode 100644 index 000000000..2aa33d9ef --- /dev/null +++ b/prelude/Formal.gf @@ -0,0 +1,54 @@ +resource Formal = open Prelude in { + +-- to replace the old library Precedence + + oper + Prec : PType ; + TermPrec : Type = {s : Str ; p : Prec} ; + + mkPrec : Prec -> Str -> TermPrec = \p,s -> + {s = s ; p = p} ; + + top : TermPrec -> Str = usePrec 0 ; + + constant : Str -> TermPrec = mkPrec highest ; + + infixl : Prec -> Str -> (_,_ : TermPrec) -> TermPrec = \p,f,x,y -> + mkPrec p (usePrec p x ++ f ++ usePrec (nextPrec p) y) ; + infixr : Prec -> Str -> (_,_ : TermPrec) -> TermPrec = \p,f,x,y -> + mkPrec p (usePrec (nextPrec p) x ++ f ++ usePrec p y) ; + infixn : Prec -> Str -> (_,_ : TermPrec) -> TermPrec = \p,f,x,y -> + mkPrec p (usePrec (nextPrec p) x ++ f ++ usePrec (nextPrec p) y) ; + +-- auxiliaries, should not be needed so much + + usePrec : Prec -> TermPrec -> Str = \p,x -> + case lessPrec x.p p of { + True => parenth x.s ; + False => parenthOpt x.s + } ; + + parenth : Str -> Str = \s -> "(" ++ s ++ ")" ; + parenthOpt : Str -> Str = \s -> variants {s ; "(" ++ s ++ ")"} ; + +--. +-- low-level things: don't use + + Prec : PType = Predef.Ints 4 ; + + highest = 4 ; + + lessPrec : Prec -> Prec -> Bool = \p,q -> + case < : Prec * Prec> of { + <3,4> | <2,3> | <2,4> => True ; + <1,1> | <1,0> | <0,0> => False ; + <1,_> | <0,_> => True ; + _ => False + } ; + + nextPrec : Prec -> Prec = \p -> case

of { + 4 => 4 ; + n => Predef.plus n 1 + } ; + +}