hfusion-0.0.1: HFusion/Internal/HsPrec.hs
-- Please, see the file LICENSE for copyright and license information.
module HFusion.Internal.HsPrec(
Precedence,
LeftParam,
hpar, -- :: Bool -> Doc -> Doc
parentizar, -- ::Precedence -> LeftParam -> Precedence -> Bool
Asoc(LeftAsoc,RightAsoc,None)
) where
import Text.PrettyPrint
type Precedence = (PrecValue,Asoc) -- Caracteriza un operador.
type LeftParam = Bool -- Se utiliza para determinar de que lado de
-- un operador infijo está un subtérmino.
type PrecValue = Int
data Asoc = LeftAsoc | RightAsoc | None
deriving (Eq,Show)
-- Inserta paréntesis o no, de acuerdo al valor del primer parámetro,
-- utilizando <> delante y detrás de la expresión en el segundo
-- parámetro.
hpar:: Bool -> Doc -> Doc
hpar paren d = if paren then char '(' <> d <> char ')'
else d
-- Decide si una expresión E2, cuyo operador O2 más externo tiene la
-- precedencia dada en el tercer parámetro, necesita ser parentizada,
-- siendo el primer parámetro la precedencia del operador O1 del cuál E2
-- es subexpresión, y el segundo parámetro indica si E2 se halla a la
-- izquierda de O1.
-- parentizar (1,LeftAsoc) False (1,_) -> True
parentizar::Precedence -> LeftParam -> Precedence -> Bool
parentizar (p0,a0) left (p1,_) = (p0>p1)||
(p0==p1)&&(if left then (a0==RightAsoc)
else (a0==LeftAsoc))