Daniel Montoya Ramos Eva Mara Garca Garca Loli Burgueo Caballero
ndice
Formateador Analizador
Analizador mondico
Formateador de textos
Analizador de textos
Analizador de textos
Introduccin
Show
Read
Analizador de textos
Analizador de textos
Analizador de textos
ReadS a
Tipo polimrfico para analizadores que
devuelven valores de tipo a type ReadS a = String -> [(a, String)] Devolver un par donde:
La primera componente ser un valor del tipo a. La segunda ser de tipo String y se corresponder con el valor de la cadena de salida.
8
Analizador de textos
Primer analizador: xito :: a -> ReadS a xito x = \s -> [(x, s)] Toma un argumento, no consume ningn carcter y devuelve ese mismo argumento. Segundo analizador: psilon :: ReadS () psilon = xito () No toma argumentos y devuelve siempre el mismo, (). Tampoco consume caracteres de la entrada. Tercer analizador: fallo :: ReadS a fallo = \s -> [] Falla siempre.
Analizador de textos
rCHar
rChar :: Char -> ReadS Char rChar c = \s -> case s of [] -> [] x:xs -> if c == x then [(x,xs)] else []
Toma un carcter como argumento Tiene xito si la cadena de entrada comienza
10
Analizador de textos
rSat rSat :: (Char -> Bool) -> ReadS Char rSat p = \s -> case s of [] -> [] x:xs -> if p x then [(x,xs)] else []
Analizador de textos
Analizador de textos
Analizador >>> infixr 6 >>> (>>>) :: ReadS a -> (a -> ReadS b) -> ReadS b p >>> f = \s -> [ (y,s2) | (x,s1) <- p s, let p2 = f x, (y,s2) <- p2 s1 ]
Argumentos: un analizador y una funcin. Ejemplo: funcin rAB rAB :: ReadS (Char, Char) rAB = rSat isUpper >>> (\x -> rSat isUpper >>> (\y -> xito (x,y))) solo tiene xito si en la entrada hay dos caracteres mayscula consecutivos y en ese caso los devuelve.
13
Analizador de textos
veces
14
Analizador de textos
pasamos el valor a Int El resultado deseado es el primero => definimos una funcin primero y la aplicamos al resultado anterior
15
Analizador de textos
Analizador de textos
17
Analizador de textos
anteriores.
18
Analizadores Mondicos
19
Representacin
20
Funciones
Analizador elemental
elemento :: Analiz Char elemento = AN (\ent -> case ent of
Secuenciacin
instance Monad Analiz where -- return :: a -> Analiz a return v = AN (\ent -> [(v,ent)]) -- (>>=) :: Analiz a -> (a -> Analiz b) -> Analiz b (AN p) >>= k = AN (\ent -> concat [aplica (k v) sal | (v,sal) <- p ent])
22
=f = id
Asociatividad de la secuenciacin
(>>=g).(>>=f)
= (>>=((>>=g).f))
23
Alternancia
instance MonadPlus Analiz where mplus (AN p) (AN q) = AN (\ent -> p ent ++ q ent) mzero = AN (\ent -> [] )
24
25
Propiedades de la alternancia
Asociativa (m !+ n) !+ o = m !+ (n!+o) Distributiva (m !+ n) >>= o = (m>>=o) !+ (n!+o) Elemento neutro mzero !+ m = m m!+ mzero = m
26
Filtros
27
letra :: Analiz Char letra = elemento !> isAlpha dgito :: Analiz Char dgito = elemento !> isDigit letraODgito = letra !+ dgito literal :: Char -> Analiz Char literal c = elemento !> (== c) Main> aplica letra "hola" [('h',"ola")] :: [(Char,Estado)] Main> aplica letra "5hola" [] :: [(Char,Estado)] Main> aplica dgito "5hola" [('5',"hola")] :: [(Char,Estado)]
28
Iteracin
iter :: Analiz a -> Analiz [a] iter m = do x <- m xs <- iter m return (x:xs) !+ return []
29
nmero :: Analiz Int nmero = do a <- dgito x <- iter dgito return (aInt (a:x)) where chrAInt :: Char -> Int chrAInt c = ord c - ord '0' aInt :: [Char] -> Int aInt = foldl1 (\x y -> 10*x + y) . map chrAInt Main> aplica nmero "123letras" [(123,"letras"),(12,"3letras"),(1,"23letras")] :: [(Int,Estado)]
30
Eleccin parcial
(!*) :: Analiz a -> Analiz a -> Analiz a m !* n = AN (\ent -> let as = aplica m ent in if (null as) then aplica n ent else as)
31
reiter :: Analiz a -> Analiz [a] reiter m = do a <- m x <- reiter m return (a:x) !* return [] nmero' = do a <- dgito x <- reiter dgito return (aInt (a:x)) where chrAInt :: Char -> Int chrAInt c = ord c - ord '0' aInt :: [Char] -> Int aInt = foldl1 (\x y -> 10*x + y) . map chrAInt Main> aplica nmero' "123letras" [(123,"letras")] :: [(Int,Estado)]
32
espacios :: Analiz String espacios = do a <- literal ' ' x <- reiter (literal ' ') return (a:x) !* return ""
token :: String -> Analiz String token xs = do _ <- espacios tk <- token' xs return tk where token' [] = return [] token' (x:xs)= do c <- elemento !> (== x) cs <- token' xs return (c:cs) Main> aplica (token "let") " let x=1 in 2*x" [("let"," x=1 in 2*x")] :: [([Char],Estado)]
33
Gramtica -- term ::= constante -| ( term + term ) -| ( term / term ) data Term = Const Int | Term :/: Term | Term :+: Term deriving Show anaConst :: Analiz Term anaConst = do a <- nmero return (Const a)
34
anaSum' :: Analiz Term anaSum' = do _ <- literal '(' u <- term' _ <- literal '+' v <- term' _ <- literal ')' return (u :+: v) anaDiv' :: Analiz Term anaDiv' = do _ <- literal '(' u <- term' _ <- literal '/' v <- term' _ <- literal ')' return (u :/: v)
35
paren :: Analiz a -> Analiz b -> Analiz c -> Analiz b paren abre m cierra = do abre x <- m cierra return x
anaSum = paren (literal '(') (do { u <- term ; literal '+' ; v <- term ; return (u :+: v)}) (literal ')') anaDiv = paren (literal '(') (do { u <- term ; literal '/' ; v <- term ; return (u :/: v)}) (literal ')')
36
anaOp :: Analiz (Term -> Term -> Term) anaOp = (do {literal '+'; return (:+:)}) !* (do {literal '/'; return (:/:)}) anaExpr :: Analiz Term anaExpr = do u <- term o <- anaOp v <- term return (o u v)
anaSD :: Analiz Term anaSD = paren (literal '(') anaExpr (literal ')')
term = anaConst !+ anaSD
37
Ruegos y preguntas
38