module I1M.Analizador
(
Analizador
, analiza
, resultado
, fallo
, elemento
, (>*>)
, (+++)
, sat
, digito
, minuscula
, mayuscula
, letra
, alfanumerico
, caracter
, cadena
, varios
, varios1
, ident
, nat
, espacio
, unidad
, identificador
, natural
, simbolo
, listaNat
, expr
, valor
) where
import Data.Char
type Analizador a = String -> [(a,String)]
analiza :: Analizador a -> String -> [(a,String)]
analiza :: Analizador a -> Analizador a
analiza Analizador a
a = Analizador a
a
resultado :: a -> Analizador a
resultado :: a -> Analizador a
resultado a
v = \String
ent -> [(a
v,String
ent)]
fallo :: Analizador a
fallo :: Analizador a
fallo = \String
_ -> []
elemento :: Analizador Char
elemento :: Analizador Char
elemento = \String
xs -> case String
xs of
[] -> []
(Char
y:String
ys) -> [(Char
y,String
ys)]
infixr 5 >*>
(>*>) :: Analizador a -> (a -> Analizador b) -> Analizador b
Analizador a
p >*> :: Analizador a -> (a -> Analizador b) -> Analizador b
>*> a -> Analizador b
f = \String
ent -> case Analizador a -> Analizador a
forall a. Analizador a -> Analizador a
analiza Analizador a
p String
ent of
[] -> []
[(a
v,String
sal)] -> Analizador b -> Analizador b
forall a. Analizador a -> Analizador a
analiza (a -> Analizador b
f a
v) String
sal
[(a, String)]
_ -> Analizador b
forall a. HasCallStack => String -> a
error String
"Imposible"
(+++) :: Analizador a -> Analizador a -> Analizador a
Analizador a
p +++ :: Analizador a -> Analizador a -> Analizador a
+++ Analizador a
q = \String
ent -> case Analizador a -> Analizador a
forall a. Analizador a -> Analizador a
analiza Analizador a
p String
ent of
[] -> Analizador a -> Analizador a
forall a. Analizador a -> Analizador a
analiza Analizador a
q String
ent
[(a
v,String
sal)] -> [(a
v,String
sal)]
[(a, String)]
_ -> Analizador a
forall a. HasCallStack => String -> a
error String
"Imposible"
sat :: (Char -> Bool) -> Analizador Char
sat :: (Char -> Bool) -> Analizador Char
sat Char -> Bool
p = Analizador Char
elemento Analizador Char -> (Char -> Analizador Char) -> Analizador Char
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \Char
x ->
if Char -> Bool
p Char
x then Char -> Analizador Char
forall a. a -> Analizador a
resultado Char
x else Analizador Char
forall a. Analizador a
fallo
digito :: Analizador Char
digito :: Analizador Char
digito = (Char -> Bool) -> Analizador Char
sat Char -> Bool
isDigit
minuscula :: Analizador Char
minuscula :: Analizador Char
minuscula = (Char -> Bool) -> Analizador Char
sat Char -> Bool
isLower
mayuscula :: Analizador Char
mayuscula :: Analizador Char
mayuscula = (Char -> Bool) -> Analizador Char
sat Char -> Bool
isUpper
letra :: Analizador Char
letra :: Analizador Char
letra = (Char -> Bool) -> Analizador Char
sat Char -> Bool
isAlpha
alfanumerico :: Analizador Char
alfanumerico :: Analizador Char
alfanumerico = (Char -> Bool) -> Analizador Char
sat Char -> Bool
isAlphaNum
caracter :: Char -> Analizador Char
caracter :: Char -> Analizador Char
caracter Char
x = (Char -> Bool) -> Analizador Char
sat (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
x)
cadena :: String -> Analizador String
cadena :: String -> Analizador String
cadena [] = String -> Analizador String
forall a. a -> Analizador a
resultado []
cadena (Char
x:String
xs) = Char -> Analizador Char
caracter Char
x Analizador Char -> (Char -> Analizador String) -> Analizador String
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \Char
y ->
String -> Analizador String
cadena String
xs Analizador String
-> (String -> Analizador String) -> Analizador String
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \String
ys ->
String -> Analizador String
forall a. a -> Analizador a
resultado (Char
yChar -> String -> String
forall a. a -> [a] -> [a]
:String
ys)
varios :: Analizador a -> Analizador [a]
varios :: Analizador a -> Analizador [a]
varios Analizador a
p = Analizador a -> Analizador [a]
forall a. Analizador a -> Analizador [a]
varios1 Analizador a
p Analizador [a] -> Analizador [a] -> Analizador [a]
forall a. Analizador a -> Analizador a -> Analizador a
+++ [a] -> Analizador [a]
forall a. a -> Analizador a
resultado []
varios1 :: Analizador a -> Analizador [a]
varios1 :: Analizador a -> Analizador [a]
varios1 Analizador a
p = Analizador a
p Analizador a -> (a -> Analizador [a]) -> Analizador [a]
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \a
v ->
Analizador a -> Analizador [a]
forall a. Analizador a -> Analizador [a]
varios Analizador a
p Analizador [a] -> ([a] -> Analizador [a]) -> Analizador [a]
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \[a]
vs ->
[a] -> Analizador [a]
forall a. a -> Analizador a
resultado (a
va -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
vs)
ident :: Analizador String
ident :: Analizador String
ident = Analizador Char
minuscula Analizador Char -> (Char -> Analizador String) -> Analizador String
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \Char
x ->
Analizador Char -> Analizador String
forall a. Analizador a -> Analizador [a]
varios Analizador Char
alfanumerico Analizador String
-> (String -> Analizador String) -> Analizador String
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \String
xs ->
String -> Analizador String
forall a. a -> Analizador a
resultado (Char
xChar -> String -> String
forall a. a -> [a] -> [a]
:String
xs)
nat :: Analizador Int
nat :: Analizador Int
nat = Analizador Char -> Analizador String
forall a. Analizador a -> Analizador [a]
varios1 Analizador Char
digito Analizador String -> (String -> Analizador Int) -> Analizador Int
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \String
xs ->
Int -> Analizador Int
forall a. a -> Analizador a
resultado (String -> Int
forall a. Read a => String -> a
read String
xs)
espacio :: Analizador ()
espacio :: Analizador ()
espacio = Analizador Char -> Analizador String
forall a. Analizador a -> Analizador [a]
varios ((Char -> Bool) -> Analizador Char
sat Char -> Bool
isSpace) Analizador String -> (String -> Analizador ()) -> Analizador ()
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \String
_ ->
() -> Analizador ()
forall a. a -> Analizador a
resultado ()
unidad :: Analizador a -> Analizador a
unidad :: Analizador a -> Analizador a
unidad Analizador a
p = Analizador ()
espacio Analizador () -> (() -> Analizador a) -> Analizador a
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \()
_ ->
Analizador a
p Analizador a -> (a -> Analizador a) -> Analizador a
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \a
v ->
Analizador ()
espacio Analizador () -> (() -> Analizador a) -> Analizador a
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \()
_ ->
a -> Analizador a
forall a. a -> Analizador a
resultado a
v
identificador :: Analizador String
identificador :: Analizador String
identificador = Analizador String -> Analizador String
forall a. Analizador a -> Analizador a
unidad Analizador String
ident
natural :: Analizador Int
natural :: Analizador Int
natural = Analizador Int -> Analizador Int
forall a. Analizador a -> Analizador a
unidad Analizador Int
nat
simbolo :: String -> Analizador String
simbolo :: String -> Analizador String
simbolo String
xs = Analizador String -> Analizador String
forall a. Analizador a -> Analizador a
unidad (String -> Analizador String
cadena String
xs)
listaNat :: Analizador [Int]
listaNat :: Analizador [Int]
listaNat = String -> Analizador String
simbolo String
"[" Analizador String
-> (String -> Analizador [Int]) -> Analizador [Int]
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \String
_ ->
Analizador Int
natural Analizador Int -> (Int -> Analizador [Int]) -> Analizador [Int]
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \Int
n ->
Analizador Int -> Analizador [Int]
forall a. Analizador a -> Analizador [a]
varios (String -> Analizador String
simbolo String
"," Analizador String -> (String -> Analizador Int) -> Analizador Int
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \String
_ ->
Analizador Int
natural) Analizador [Int] -> ([Int] -> Analizador [Int]) -> Analizador [Int]
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \[Int]
ns ->
String -> Analizador String
simbolo String
"]" Analizador String
-> (String -> Analizador [Int]) -> Analizador [Int]
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \String
_ ->
[Int] -> Analizador [Int]
forall a. a -> Analizador a
resultado (Int
nInt -> [Int] -> [Int]
forall a. a -> [a] -> [a]
:[Int]
ns)
expr :: Analizador Int
expr :: Analizador Int
expr = Analizador Int
term Analizador Int -> (Int -> Analizador Int) -> Analizador Int
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \Int
t ->
(String -> Analizador String
simbolo String
"+" Analizador String -> (String -> Analizador Int) -> Analizador Int
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \String
_ ->
Analizador Int
expr Analizador Int -> (Int -> Analizador Int) -> Analizador Int
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \Int
e ->
Int -> Analizador Int
forall a. a -> Analizador a
resultado (Int
tInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
e))
Analizador Int -> Analizador Int -> Analizador Int
forall a. Analizador a -> Analizador a -> Analizador a
+++ (String -> Analizador String
simbolo String
"-" Analizador String -> (String -> Analizador Int) -> Analizador Int
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \String
_ ->
Analizador Int
expr Analizador Int -> (Int -> Analizador Int) -> Analizador Int
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \Int
e ->
Int -> Analizador Int
forall a. a -> Analizador a
resultado (Int
tInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
e))
Analizador Int -> Analizador Int -> Analizador Int
forall a. Analizador a -> Analizador a -> Analizador a
+++ Int -> Analizador Int
forall a. a -> Analizador a
resultado Int
t
term :: Analizador Int
term :: Analizador Int
term = Analizador Int
factor Analizador Int -> (Int -> Analizador Int) -> Analizador Int
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \Int
f ->
(String -> Analizador String
simbolo String
"*" Analizador String -> (String -> Analizador Int) -> Analizador Int
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \String
_ ->
Analizador Int
term Analizador Int -> (Int -> Analizador Int) -> Analizador Int
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \Int
t ->
Int -> Analizador Int
forall a. a -> Analizador a
resultado (Int
fInt -> Int -> Int
forall a. Num a => a -> a -> a
*Int
t))
Analizador Int -> Analizador Int -> Analizador Int
forall a. Analizador a -> Analizador a -> Analizador a
+++ (String -> Analizador String
simbolo String
"/" Analizador String -> (String -> Analizador Int) -> Analizador Int
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \String
_ ->
Analizador Int
term Analizador Int -> (Int -> Analizador Int) -> Analizador Int
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \Int
t ->
Int -> Analizador Int
forall a. a -> Analizador a
resultado (Int
f Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
t))
Analizador Int -> Analizador Int -> Analizador Int
forall a. Analizador a -> Analizador a -> Analizador a
+++ Int -> Analizador Int
forall a. a -> Analizador a
resultado Int
f
factor :: Analizador Int
factor :: Analizador Int
factor = (String -> Analizador String
simbolo String
"(" Analizador String -> (String -> Analizador Int) -> Analizador Int
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \String
_ ->
Analizador Int
expr Analizador Int -> (Int -> Analizador Int) -> Analizador Int
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \Int
e ->
String -> Analizador String
simbolo String
")" Analizador String -> (String -> Analizador Int) -> Analizador Int
forall a b. Analizador a -> (a -> Analizador b) -> Analizador b
>*> \String
_ ->
Int -> Analizador Int
forall a. a -> Analizador a
resultado Int
e)
Analizador Int -> Analizador Int -> Analizador Int
forall a. Analizador a -> Analizador a -> Analizador a
+++ Analizador Int
natural
valor :: String -> Int
valor :: String -> Int
valor String
xs = case (Analizador Int -> Analizador Int
forall a. Analizador a -> Analizador a
analiza Analizador Int
expr String
xs) of
[(Int
n,[])] -> Int
n
[(Int
_,String
sal)] -> String -> Int
forall a. HasCallStack => String -> a
error (String
"entrada sin usar " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
sal)
[] -> String -> Int
forall a. HasCallStack => String -> a
error String
"entrada no valida"
[(Int, String)]
_ -> String -> Int
forall a. HasCallStack => String -> a
error String
"Imposible"