License | Creative Commons |
---|---|
Maintainer | José A. Alonso |
Safe Haskell | Safe |
Language | Haskell2010 |
Analizadores sintácticos de expresiones aritméticas.
Este módulo contiene la definición de los analizadores sintácticos de expresiones aritméticas estudiados en el tema 12 del curso.
Synopsis
- type Analizador a = String -> [(a, String)]
- analiza :: Analizador a -> String -> [(a, String)]
- resultado :: a -> Analizador a
- fallo :: Analizador a
- elemento :: Analizador Char
- (>*>) :: Analizador a -> (a -> Analizador b) -> Analizador b
- (+++) :: Analizador a -> Analizador a -> Analizador a
- sat :: (Char -> Bool) -> Analizador Char
- digito :: Analizador Char
- minuscula :: Analizador Char
- mayuscula :: Analizador Char
- letra :: Analizador Char
- alfanumerico :: Analizador Char
- caracter :: Char -> Analizador Char
- cadena :: String -> Analizador String
- varios :: Analizador a -> Analizador [a]
- varios1 :: Analizador a -> Analizador [a]
- ident :: Analizador String
- nat :: Analizador Int
- espacio :: Analizador ()
- unidad :: Analizador a -> Analizador a
- identificador :: Analizador String
- natural :: Analizador Int
- simbolo :: String -> Analizador String
- listaNat :: Analizador [Int]
- expr :: Analizador Int
- valor :: String -> Int
El tipo de los analizadores
type Analizador a = String -> [(a, String)] Source #
El tipo de los analizadores.
analiza :: Analizador a -> String -> [(a, String)] Source #
(analiza a cs) es el resultado de aplicar el analizador a a la cadena cs.
Analizadores básicos
resultado :: a -> Analizador a Source #
El analizador (resultado v`) siempre tiene éxito, devuelve v y no consume nada. Por ejemplo,
analiza (resultado 3) "Hola" == [(3,"Hola")]
fallo :: Analizador a Source #
El analizador fallo
siempre falla. Por ejemplo,
analiza fallo "Hola" == []
elemento :: Analizador Char Source #
El analizador elemento
falla si la cadena es vacía y consume el primer
elemento en caso contrario. Por ejemplo,
analiza elemento "Hola" == [('H',"ola")] analiza elemento "" == []
Secuenciación
(>*>) :: Analizador a -> (a -> Analizador b) -> Analizador b infixr 5 Source #
((p >*> f) e) falla si el análisis de e por p falla, en caso contrario, se obtiene un valor (v) y una salida (s), se aplica la función f al valor v obteniéndose un nuevo analizador con el que se analiza la salida s.
Elección
(+++) :: Analizador a -> Analizador a -> Analizador a Source #
((p +++ q) e) analiza e con p y si falla analiza e con q. Por ejemplo,
analiza (elemento +++ resultado 'd') "abc" == [('a',"bc")] analiza (fallo +++ resultado 'd') "abc" == [('d',"abc")] analiza (fallo +++ fallo) "abc" == []
Primitivas derivadas
sat :: (Char -> Bool) -> Analizador Char Source #
(sat p) es el analizador que consume un elemento si dicho elemento cumple la propiedad p y falla en caso contrario. Por ejemplo,
analiza (sat isLower) "hola" == [('h',"ola")] analiza (sat isLower) "Hola" == []
digito :: Analizador Char Source #
digito
analiza si el primer carácter es un dígito. Por ejemplo,
analiza digito "123" == [('1',"23")] analiza digito "uno" == []
minuscula :: Analizador Char Source #
`minuscula
analiza si el primer carácter es una letra
minúscula. Por ejemplo,
analiza minuscula "eva" == [('e',"va")] analiza minuscula "Eva" == []
mayuscula :: Analizador Char Source #
mayuscula
analiza si el primer carácter es una letra
mayúscula. Por ejemplo,
analiza mayuscula "Eva" == [('E',"va")] analiza mayuscula "eva" == []
letra :: Analizador Char Source #
letra
analiza si el primer carácter es una letra. Por ejemplo,
analiza letra "Eva" == [('E',"va")] analiza letra "eva" == [('e',"va")] analiza letra "123" == []
alfanumerico :: Analizador Char Source #
alfanumerico
analiza si el primer carácter es una letra o un
número. Por ejemplo,
analiza alfanumerico "Eva" == [('E',"va")] analiza alfanumerico "eva" == [('e',"va")] analiza alfanumerico "123" == [('1',"23")] analiza alfanumerico " 123" == []
caracter :: Char -> Analizador Char Source #
(caracter x)
analiza si el primer carácter es igual al carácter
x. Por ejemplo,
analiza (caracter 'E') "Eva" == [('E',"va")] analiza (caracter 'E') "eva" == []
cadena :: String -> Analizador String Source #
(cadena c)
analiza si empieza con la cadena c. Por ejemplo,
analiza (cadena "abc") "abcdef" == [("abc","def")] analiza (cadena "abc") "abdcef" == []
varios :: Analizador a -> Analizador [a] Source #
(varios p) aplica el analizador p cero o más veces. Por ejemplo,
analiza (varios digito) "235abc" == [("235","abc")] analiza (varios digito) "abc235" == [("","abc235")]
varios1 :: Analizador a -> Analizador [a] Source #
(varios1 p) aplica el analizador p una o más veces. Por ejemplo,
analiza (varios1 digito) "235abc" == [("235","abc")] analiza (varios1 digito) "abc235" == []
ident :: Analizador String Source #
ident
analiza si comienza con un identificador (i.e. una cadena que
comienza con una letra minúscula seguida por caracteres
alfanuméricos). Por ejemplo,
analiza ident "lunes12 de Ene" == [("lunes12"," de Ene")] analiza ident "Lunes12 de Ene" == []
nat :: Analizador Int Source #
nat
analiza si comienza con un número natural. Por ejemplo,
analiza nat "14DeAbril" == [(14,"DeAbril")] analiza nat " 14DeAbril" == []
espacio :: Analizador () Source #
espacio
analiza si comienza con espacios en blanco. Por ejemplo,
analiza espacio " a b c" == [((),"a b c")]
Tratamiento de espacios
unidad :: Analizador a -> Analizador a Source #
(unidad p) ignora los espacios en blanco y aplica el analizador
p
. Por ejemplo,
analiza (unidad nat) " 14DeAbril" == [(14,"DeAbril")] analiza (unidad nat) " 14 DeAbril" == [(14,"DeAbril")]
identificador :: Analizador String Source #
identificador
analiza un identificador ignorando los espacios
delante y detrás. Por ejemplo,
analiza identificador " lunes12 de Ene" == [("lunes12","de Ene")]
natural :: Analizador Int Source #
natural
analiza un número natural ignorando los espacios delante
y detrás. Por ejemplo,
analiza natural " 14DeAbril" == [(14,"DeAbril")]
simbolo :: String -> Analizador String Source #
(simbolo xs) analiza la cadena xs
ignorando los espacios delante
y detrás. Por ejemplo,
analiza (simbolo "abc") " abcdef" == [("abc","def")]
listaNat :: Analizador [Int] Source #
listaNat
analiza una lista de naturales ignorando los
espacios. Por ejemplo,
analiza listaNat " [ 2, 3, 5 ]" == [([2,3,5],"")] analiza listaNat " [ 2, 3,]" == []
Expresiones aritméticas
expr :: Analizador Int Source #
expr
analiza una expresión aritmética devolviendo su valor. Por
ejemplo,
analiza expr "2*3+5" == [(11,"")] analiza expr "2*(3+5)" == [(16,"")] analiza expr "2+3*5" == [(17,"")] analiza expr "2*3+5abc" == [(11,"abc")]
valor :: String -> Int Source #
(valor cs) analiza la cadena cs devolviendo su valor si es una expresión aritmética y un mensaje de error en caso contrario. Por ejemplo,
valor "2*3+5" == 11 valor "2*(3+5)" == 16 valor "2 * 3 + 5" == 11 valor "2*3x+5y" == *** Exception: entrada sin usar x+5y valor "-1" == *** Exception: entrada no valida