packages feed

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))