Formateador y Analizador de textos Daniel Montoya Ramos
- Slides: 38
Formateador y Analizador de textos Daniel Montoya Ramos Eva María García Loli Burgueño Caballero 1
Índice Formateador Analizador monádico 2
Formateador de textos 3
Analizador de textos 4
Analizador de textos � Introducción › Show › Read 5
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 › 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 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 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 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 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. 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 -> (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 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 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 -> 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 '+' -+- 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. S [Integer] › Devuelve un analizador de enteros › Es fácil de definir a partir de los operadores anteriores. 18
Analizadores Monádicos 19
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 › 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 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 › (>>= return) � Asociatividad › (>>=g). (>>=f) =f = id de la secuenciación = (>>=((>>=g). f)) 23
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 : : 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 !+ (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 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 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 = do x <- m xs <- iter m return (x: xs) !+ return [] 29
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 !* 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 -> 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 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 -| ( 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' = 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 : : 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) 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
- Analizador de textos literarios
- Analizador de textos en latin
- Geraldi montoya
- Jennifer montoya estatura
- Dorothea serial killer
- Bicicletas montoya murcia
- óscar osvaldo garcía montoya
- Juliana montoya cardona
- Briana montoya
- Oscar danilo montoya giraldo
- Oscar danilo montoya giraldo
- Juanita montoya yale
- Inigo montoya introduction
- Pila semántica en un analizador sintáctico.
- Analizador de procesos
- Etilbenceno masa molar
- Analizador sintáctico ll
- Mystilus analizador
- Analizador en tiempo real
- Shane ramos
- Historia do domingo de ramos
- Mercado de trabalho para contador
- Ang ibong adarna ay isang uri ng korido
- Andrea ramos desnuda
- Luiz felipe ramos
- Luciana ramos lira
- Diagrama uml clase abstracta
- Denise ramos de almeida
- Ramos de economia
- Partes de un angiocath
- Objetivo del domingo de ramos
- When mr ramos died 1/3
- Imágenes de domingo de ramos
- Pedro nogueira ramos
- Alfredo ramos martinez
- Hoje é domingo de ramos?
- Ramos da física
- Domingo de ramos preguntas
- Niosel