120 likes | 217 Views
Um Interpretador para Exp1. Haskell Prática 2. Tipos algébricos recursivos. Tipos de dados recursivos data Expr = Lit Int | Add Expr Expr | Sub Expr Expr Funções definidas recursivamente
E N D
Um Interpretador para Exp1 Haskell Prática 2
Tipos algébricos recursivos • Tipos de dados recursivos data Expr = Lit Int | Add Expr Expr | Sub Expr Expr • Funções definidas recursivamente eval :: Expr -> Inteval (Lit n) = neval (Add e1 e2) = (eval e1) + (eval e2)eval (Sub e1 e2) = (eval e1) - (eval e2)
Tipos algébricos polimórficos • Tipos de dados polimórficos: data Pairs t = Pair t t Pair 6 8 :: Pairs Int Pair True True :: Pairs Bool Pair [] [1,3] :: Pair [Int] • Listas data List t = Nil | Cons t (List t) • Árvores binárias data Tree t = NilT | Node t (Tree t) (Tree t)
Derivando instâncias de classes data List t = Nil | Cons t (List t) deriving (Eq,Ord,Show) data Tree t = NilT | Node t (Tree t) (Tree t) deriving (Eq,Ord,Show)
Exercícios • Defina as seguintes funções: showExpr :: Expr -> String toList :: List t -> [t] fromList :: [t] -> List t depth :: Tree t -> Int collapse :: Tree t -> [t] mapTree :: (t -> u) -> Tree t -> Tree u
Linguagem Exp1 • Inclui apenas valores constantes (literais) e operações sobre valores • Valores e operações sobre inteiros, booleanos e string são admitidos • Um programa é uma expressão • Agrupa valores em tipos e uma verificação de tipos pode ser implementada
Sintaxe Abstrata da Linguagem Exp1 Programa ::= Expressao Expressao ::= Valor | ExpUnaria | ExpBinaria Valor ::= ValorConcreto ValorConcreto ::= ValorInteiro | ValorBooleano | ValorString ExpUnaria ::= "-" Expressao | "not" Expressao | "length" Expressao ExpBinaria ::= Expressao "+" Expressao | Expressao "-" Expressao | Expressao "and" Expressao | Expressao "or" Expressao | Expressao "==" Expressao | Expressao "++" Expressao
Programas de Exp1 • Programa 1 4 • Programa 2 4 + 5
Sintaxe Abstrata de Exp1 data Programa = PROG Expressao data Expressao = LITI Int | LITB Bool | LITS String -- ExpUnaria | MINUS Expressao | NOT Expressao | LENGTH Expressao -- ExpBinaria | SOMA Expressao Expressao | SUBTRACAO Expressao Expressao | AND Expressao Expressao | OR Expressao Expressao | IGUAL Expressao Expressao | CONCATENA Expressao Expressao
Exemplos de programas Exp1 p1 = PROG (LITI 4) p2 = PROG (SOMA (LITI 4) (LITI 5))
Entidades Semânticas -- Valores -- data Valor = V1 Int | V2 Bool | V3 String -- showValor :: Valor -> String -- showValor (V1 i) = show i -- showValor (V2 b) = show b -- showValor (V3 s) = show s
Função de Interpretação interprete :: Programa -> String interprete (PROG e) = show (eval e) -- Funcao de Avaliacao de Expressoes eval :: Expressao -> Valor eval (LITI i) = i eval (LITB b) = b eval (LITS s) = s eval (NOT e) = not (eval e) eval (SOMA e1 e2) = (eval e1) + (eval e2)