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