I1M-0.1.0.0: Código de I1M.

LicenseCreative Commons
MaintainerJosé A. Alonso
Safe HaskellSafe
LanguageHaskell2010

I1M.Analizador

Contents

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