Formateador y Analizador de textos Daniel Montoya Ramos

  • Slides: 38
Download presentation
Formateador y Analizador de textos Daniel Montoya Ramos Eva María García Loli Burgueño Caballero

Formateador y Analizador de textos Daniel Montoya Ramos Eva María García Loli Burgueño Caballero 1

Índice Formateador Analizador monádico 2

Índice Formateador Analizador monádico 2

Formateador de textos 3

Formateador de textos 3

Analizador de textos 4

Analizador de textos 4

Analizador de textos � Introducción › Show › Read 5

Analizador de textos � Introducción › Show › Read 5

Analizador de textos � Analizador que reconoce una lista de uno o más enteros

Analizador de textos � Analizador que reconoce una lista de uno o más enteros › Operadores (combinadores) �Metasímbolo definición (: : =) �Metasímbolo alternativa (|) �Metasímbolo repetición ({}0) �Metasímbolo repetición no vacía ({}1) �Metasímbolo opción ([]) �Metasímbolo agrupación (()) 6

Analizador de textos � Analizador que reconoce una lista de uno o más enteros

Analizador de textos � Analizador que reconoce una lista de uno o más enteros › Gramática �Dígito : : = 0|1|2|3|4|5|6|7|8|9 �Num. Natural : : = {Dígito}1 �Num. Entero : : = [+|-] Num. Natural �Lista. Enteros : : = [ Enumeración ] �Enumeración : : = Num. Entero {, Num. Entero}0 7

Analizador de textos � Read. S a › Tipo polimórfico para analizadores que devuelven

Analizador de textos � Read. S a › Tipo polimórfico para analizadores que devuelven valores de tipo a type Read. S 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 -> Read. S a éxito

Analizador de textos Primer analizador: éxito : : a -> Read. S a éxito x = s -> [(x, s)] Toma un argumento, no consume ningún carácter y devuelve ese mismo argumento. � Segundo analizador: épsilon : : Read. S () épsilon = éxito () No toma argumentos y devuelve siempre el mismo, (). Tampoco consume caracteres de la entrada. � Tercer analizador: fallo : : Read. S a fallo = s -> [] Falla siempre. � 9

Analizador de textos � r. CHar r. Char : : Char -> Read. S

Analizador de textos � r. CHar r. Char : : Char -> Read. S Char r. Char c = s -> case s of [] -> [] x: xs -> if c == x then [(x, xs)] else [] › Toma un carácter como argumento › Tiene éxito si la cadena de entrada comienza por ese carácter y en ese caso lo consume 10

Analizador de textos r. Sat : : (Char -> Bool) -> Read. S Char

Analizador de textos r. Sat : : (Char -> Bool) -> Read. S Char r. Sat p = s -> case s of [] -> [] x: xs -> if p x then [(x, xs)] else [] � › Más general que r. Char › Recibe como argumento una condición › Tiene éxito si el primer carácter de la cadena de entrada cumple la condición y en ese caso lo consume. 11

Analizador de textos � Metasímbolo alternativa. Analizador -+- infixl 5 -+(-+-) : : Read.

Analizador de textos � Metasímbolo alternativa. Analizador -+- infixl 5 -+(-+-) : : Read. S a -> Read. S a p 1 -+- p 2 = s -> p 1 s ++ p 2 s › El analizador p 1 -+- p 2 tendrá éxito si lo tiene p 1, p 2 o ambos › Devolverá en la lista solución el resultado de aplicar p 1 y el de aplicar p 2 12

Analizador de textos Analizador >>> infixr 6 >>> (>>>) : : Read. S a

Analizador de textos Analizador >>> infixr 6 >>> (>>>) : : Read. S a -> (a -> Read. S b) -> Read. S b p >>> f = s -> [ (y, s 2) | (x, s 1) <- p s, let p 2 = f x, (y, s 2) <- p 2 s 1 ] � › Argumentos: un analizador y una función. › Ejemplo: función r. AB : : Read. S (Char, Char) r. AB = r. Sat is. Upper >>> (x -> r. Sat is. Upper >>> (y -> éxito (x, y))) �solo tiene éxito si en la entrada hay dos caracteres mayúscula consecutivos y en ese caso los devuelve. 13

Analizador de textos � Metasímbolo repetición (rep 1) rep 1 : : Read. S

Analizador de textos � Metasímbolo repetición (rep 1) rep 1 : : Read. S a -> Read. S [a] › Aplica el analizador p una o más veces a la entrada y devuelve el resultado en una lista � Metasímbolo repetición no vacía (rep 0) rep 0 : : Read. S a -> Read. S [a] › Idem pero también permite aplicarla cero veces 14

Analizador de textos � Reconocer números naturales r. Num. Natural : : Read. S

Analizador de textos � Reconocer números naturales r. Num. Natural : : Read. S Integer › Devuelve un analizador de enteros › Usamos los combinadores definidos y pasamos el valor a Int › El resultado deseado es el primero => definimos una función primero y la aplicamos al resultado anterior 15

Analizador de textos � Metasímbolo de opción (? ) : : Read. S a

Analizador de textos � Metasímbolo de opción (? ) : : Read. S a -> Read. S a › Argumentos: 1. Primer argumento: Analizador p 2. Segundo argumento › Si p tiene éxito sobre la cadena de entrada devuelve dicho resultado › Si p falla devuelve el segundo argumento. 16

Analizador de textos � Reconocer números enteros › Ideas generales �(r. Char '+' -+-

Analizador de textos � Reconocer números enteros › Ideas generales �(r. Char '+' -+- r. Char '-') “<cadena>” 1. <cadena> empieza por ‘+’ 2. <cadena> empieza por ‘-’ 3. <cadena> empieza por un dígito �((r. Char '+' -+- r. Char '-') ? ‘+’) “<cadena>” �Problema resuelto �Queda reconocer el numero natural 17

Analizador de textos � Lista de números enteros r. Lista. Enteros : : Read.

Analizador de textos � Lista de números enteros r. Lista. Enteros : : Read. S [Integer] › Devuelve un analizador de enteros › Es fácil de definir a partir de los operadores anteriores. 18

Analizadores Monádicos 19

Analizadores Monádicos 19

Representación data Analiz a = AN (Estado -> [(a, Estado)]) type Estado = String

Representación data Analiz a = AN (Estado -> [(a, Estado)]) type Estado = String 20

Funciones � Aplicar un analizador a una cadena de entrada devolviendo los posibles análisis

Funciones � Aplicar un analizador a una cadena de entrada devolviendo los posibles análisis › aplica : : Analiz a -> String -> [(a, Estado)] › aplica (AN p) ent = p ent � Analizador elemental › elemento : : Analiz Char › elemento = AN (ent -> case ent of [] -> [] (x: xs) -> [(x, xs)]) 21

Secuenciación � instance Monad Analiz where � -- return : : a -> Analiz

Secuenciación � 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

Propiedades de las Mónadas � Elemento neutro de la secuenciación › (>>=f). return ›

Propiedades de las Mónadas � Elemento neutro de la secuenciación › (>>=f). return › (>>= return) � Asociatividad › (>>=g). (>>=f) =f = id de la secuenciación = (>>=((>>=g). f)) 23

Alternancia � instance Monad. Plus Analiz where � mplus (AN p) (AN q) =

Alternancia � instance Monad. Plus Analiz where � mplus (AN p) (AN q) = AN (ent -> p ent ++ q ent) � mzero = AN (ent -> [] ) � (!+) : : Analiz a -> Analiz a � (!+) = mplus 24

Ejemplo: Analizador que lee uno o dos elementos � uno. ODos. Elementos : :

Ejemplo: Analizador que lee uno o dos elementos � uno. ODos. Elementos : : Analiz String � uno. ODos. Elementos = elemento. S !+ dos. Elementos � Main> aplica uno. ODos. Elementos "" � [] : : [([Char], Estado)] � Main> aplica uno. ODos. Elementos "h" � [("h", "")] : : [([Char], Estado)] � Main> aplica uno. ODos. Elementos "hola" � [("h", "ola"), ("ho", "la")] : : [([Char], Estado)] 25

Propiedades de la alternancia � Asociativa (m !+ n) !+ o = m !+

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 � (!>) �k : : Analiz a -> (a -> Bool) -> Analiz

Filtros � (!>) �k : : Analiz a -> (a -> Bool) -> Analiz a !> p = do a <- k if p a then return a else mzero 27

Ejemplos: analizadores de letra, dígito o ambos � � letra : : Analiz Char

Ejemplos: analizadores de letra, dígito o ambos � � letra : : Analiz Char letra = elemento !> is. Alpha � � dígito : : Analiz Char dígito = elemento !> is. Digit � letra. ODígito = letra !+ dígito � � literal : : Char -> Analiz Char literal c = elemento !> (== c) � � � Main> aplica letra "hola" [('h', "ola")] : : [(Char, Estado)] Main> aplica letra "5 hola" [] : : [(Char, Estado)] Main> aplica dígito "5 hola" [('5', "hola")] : : [(Char, Estado)] 28

Iteración � iter : : Analiz a -> Analiz [a] � iter m =

Iteración � iter : : Analiz a -> Analiz [a] � iter m = do x <- m xs <- iter m return (x: xs) !+ return [] 29

Ejemplo: analizar un número � � número : : Analiz Int número = do

Ejemplo: analizar un número � � número : : Analiz Int número = do a <- dígito x <- iter dígito return (a. Int (a: x)) where chr. AInt : : Char -> Int chr. AInt c = ord c - ord '0' a. Int : : [Char] -> Int a. Int = foldl 1 (x y -> 10*x + y). map chr. AInt � � Main> aplica número "123 letras" [(123, "letras"), (12, "3 letras"), (1, "23 letras")] : : [(Int, Estado)] 30

Elección parcial � (!*) : : Analiz a -> Analiz a � m !*

Elección parcial � (!*) : : Analiz a -> Analiz a � m !* n = AN (ent -> let as = aplica m ent in if (null as) then aplica n ent else as) 31

Ejemplo: analizador más largo, número más largo � � reiter : : Analiz a

Ejemplo: analizador más largo, número más largo � � reiter : : Analiz a -> Analiz [a] reiter m = do a <- m x <- reiter m return (a: x) !* return [] � número' = do a <- dígito x <- reiter dígito return (a. Int (a: x)) where chr. AInt : : Char -> Int chr. AInt c = ord c - ord '0' a. Int : : [Char] -> Int a. Int = foldl 1 (x y -> 10*x + y). map chr. AInt � � Main> aplica número' "123 letras" [(123, "letras")] : : [(Int, Estado)] 32

Ejemplo: leer cadena de espacios, token sin espacios � � espacios : : Analiz

Ejemplo: leer cadena de espacios, token sin espacios � � 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

Un analizador para términos � � Gramática -- term : : = constante -|

Un analizador para términos � � Gramática -- term : : = constante -| ( term + term ) -| ( term / term ) � data Term = Const Int | Term : /: Term | Term : +: Term deriving Show � � ana. Const : : Analiz Term ana. Const = do a <- número return (Const a) 34

Un analizador para términos � � ana. Sum' : : Analiz Term ana. Sum'

Un analizador para términos � � ana. Sum' : : Analiz Term ana. Sum' = do _ <- literal '(' u <- term' _ <- literal '+' v <- term' _ <- literal ')' return (u : +: v) � � ana. Div' : : Analiz Term ana. Div' = do _ <- literal '(' u <- term' _ <- literal '/' v <- term' _ <- literal ')' return (u : /: v) 35

Un analizador para términos � Analizador más genérico con delimitadores � � paren :

Un analizador para términos � Analizador más genérico con delimitadores � � paren : : Analiz a -> Analiz b -> Analiz c -> Analiz b paren abre m cierra = do abre x <- m cierra return x � ana. Sum = paren (literal '(') (do { u <- term ; literal '+' ; v <- term ; return (u : +: v)}) (literal ')') � ana. Div = paren (literal '(') (do { u <- term ; literal '/' ; v <- term ; return (u : /: v)}) (literal ')') 36

Un analizador para términos � � ana. Op : : Analiz (Term -> Term)

Un analizador para términos � � ana. Op : : Analiz (Term -> Term) ana. Op = (do {literal '+'; return (: +: )}) !* (do {literal '/'; return (: /: )}) � � ana. Expr : : Analiz Term ana. Expr = do u <- term o <- ana. Op v <- term return (o u v) � � ana. SD : : Analiz Term ana. SD = paren (literal '(') ana. Expr (literal ')') � term = ana. Const !+ ana. SD 37

Ruegos y preguntas 38

Ruegos y preguntas 38