I1M-0.2.0: Code for the Haskell course taught at the University of Seville.
LicenseCreative Commons
MaintainerJosé A. Alonso
Safe HaskellSafe-Inferred
LanguageHaskell2010

I1M.Analizador

Description

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

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