Skip to content

Commit

Permalink
Dinamico - Funcionando & Estatico - Mais ou menos
Browse files Browse the repository at this point in the history
  • Loading branch information
LSinzker committed May 9, 2017
1 parent 6556017 commit 34e3990
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 310 deletions.
64 changes: 36 additions & 28 deletions LFLE01D.hs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ data Expressao = Valor Int
| Let Id Expressao Expressao
| Ref Id
| Aplicacao Nome Expressao
| ExpExp Id Expressao Expressao
deriving(Show, Eq)

avaliar :: Expressao -> Ambiente -> Int
Expand All @@ -30,49 +29,58 @@ avaliar (Aplicacao nome exp) amb =
let (DecFuncao n arg corpo) = pesquisarFuncao nome amb
in avaliar (substAplica arg (avaliar exp amb) corpo amb) amb

avaliar (Let subId expNomeada corpoExp) amb
|corpoExp /= (Aplicacao n e) = avaliar (substituicao subId (avaliar expNomeada amb) corpoExp) amb
|otherwise = avaliar (pesquisarArgumento n subId (avaliar expNomeada amb) corpoExp amb) amb
where
Aplicacao n e = corpoExp
avaliar (Let subId expNomeada corpoExp) amb =
avaliar (substAplica subId (avaliar expNomeada amb) corpoExp amb) amb
-- |corpoExp /= (Aplicacao n e) = avaliar (substituicao subId (avaliar expNomeada amb) corpoExp) amb
-- |otherwise = avaliar (substAplica subId (avaliar expNomeada amb) corpoExp amb) amb
-- where
-- Aplicacao n e = corpoExp

avaliar (Ref var) _ = error "avaliando uma variavel livre."

pesquisarFuncao :: Nome -> Ambiente -> DecFuncao
pesquisarFuncao nome [] = error ("Funcao " ++ nome ++ " nao declarada.")
pesquisarFuncao nome [] = error ("Funcao " ++ nome ++ " nao declarada")
pesquisarFuncao nome (dec@(DecFuncao n a e):xs)
| nome == n = dec
| otherwise = pesquisarFuncao nome xs

pesquisarArgumento :: Nome -> Id -> Int -> Expressao -> Ambiente -> Expressao
pesquisarArgumento nome subId val corpoExp [] = error ("Funcao nao declarada.")
pesquisarArgumento nome subId val corpoExp amb
| subId == arg = (Aplicacao nome (Valor val))
| otherwise = substAplica subId val corpoExp amb
--
where
(DecFuncao n arg corpo) = pesquisarFuncao nome amb
Let boundId namedExp bodyExp = corpoExp
-- "x" (Valor 4) (Aplicacao (Soma(Ref "x")(Ref "y")))

substituicao :: Id -> Int -> Expressao -> Expressao
substituicao subId val (Valor n) = Valor n
substituicao subId val (Soma e d) = Soma (substituicao subId val e)(substituicao subId val d)
substituicao subId val (Subtracao e d) = Subtracao (substituicao subId val e)(substituicao subId val d)
substituicao subId val (Multiplicacao e d) = Multiplicacao (substituicao subId val e)(substituicao subId val d)
substituicao subId val (Divisao e d) = Divisao (substituicao subId val e)(substituicao subId val d)
substituicao subId val (Let boundId namedExp bodyExp)
| subId == boundId = (Let boundId namedExp bodyExp)
| otherwise = Let boundId namedExp (substituicao subId val bodyExp)
| subId == boundId = (Let boundId namedExp bodyExp)
| otherwise = Let boundId namedExp (substituicao subId val bodyExp)

substituicao subId val (Ref var)
| subId == var = (Valor val)
| otherwise = (Ref var)
| subId == var = (Valor val)
| otherwise = (Ref var)

substituicao subId val (Aplicacao nome exp) = Aplicacao nome exp

substAplica :: Id -> Int -> Expressao -> Ambiente -> Expressao
substAplica subId val (Aplicacao nome exp) amb = Let subId (Valor val)(Let arg exp corpo)
where
DecFuncao n arg corpo = pesquisarFuncao nome amb
substAplica subId val (Let boundId namedExp bodyExp) amb
| subId == boundId = (Let boundId namedExp bodyExp)
| otherwise = Let boundId namedExp (substituicao subId val bodyExp)
substAplica subId val (Valor n) amb = Valor n
substAplica subId val (Soma e d) amb = Soma (substituicao subId val e)(substituicao subId val d)
substAplica subId val (Subtracao e d) amb = Subtracao (substituicao subId val e)(substituicao subId val d)
substAplica subId val (Multiplicacao e d) amb = Multiplicacao (substituicao subId val e)(substituicao subId val d)
substAplica subId val (Divisao e d) amb = Divisao (substituicao subId val e)(substituicao subId val d)
substAplica subId val (Let boundId namedExp bodyExp) amb =
substRef subId val (Let boundId namedExp bodyExp) amb

substAplica subId val (Ref var) amb
| subId == var = (Valor val)
| otherwise = (Ref var)

substAplica subId val (Aplicacao nome exp) amb =
let (DecFuncao n arg corpo) = pesquisarFuncao nome amb
in Let subId (Valor val)(Let arg exp (corpo))

substRef :: Id -> Int -> Expressao -> Ambiente -> Expressao
substRef subId val (Let boundId namedExp bodyExp) amb
| namedExp == (Ref subId) = Let boundId (Valor val) bodyExp
| otherwise = Let boundId namedExp (substAplica subId val bodyExp amb)


-- Let boundId namedExp (substAplica subId val bodyExp amb)
2 changes: 1 addition & 1 deletion LFLE01E.hs
Original file line number Diff line number Diff line change
Expand Up @@ -81,4 +81,4 @@ substAplica subId val (Let boundId namedExp bodyExp) amb

substAplica subId val (Aplicacao nome exp) amb =
let (DecFuncao n arg corpo) = pesquisarFuncao nome amb
in Let subId (Valor val)(Let arg exp (corpo))
in Let subId (Valor val)(Let arg exp (corpo))
10 changes: 1 addition & 9 deletions LFLEDTestes.hs
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,7 @@ apAdd = Aplicacao "add" (Valor 3)
let00 = Let "x" (Valor 3)(Let "y" (Valor 4) apAdd)

let01 = Let "x" (Valor 4)(apInc)
--avaliar (Let "x" (Valor 4)(Aplicacao "inc" (Valor 2))) amb
--avaliar (pesquisarArgumento "x" 4 (Aplicacap "inc" (Valor 2)) amb) amb
--avaliar (Aplicacao "inc" (Valor 4)) amb
--avaliar (substAplica "x" 4 (Soma(Ref "x")..)


let02 = Let "y" (Valor 3)(Let "x" (Valor 4) (Aplicacao "add" (Valor 3)))
-- Let "y" (Valor 3)(Aplicacao "add" (Valor 4))

--avaliar (Let "y" (Valor 3)(Let "x" (Valor 4) (Aplicacao "add" (Valor 3))))
--avaliar (pesquisarArgumento "add" "y" 3 (Let "x" (Valor 4) (Aplicacao "add" (Valor 3))))
--avaliar (Let "y" (Valor 3) )
let03 = Let "x" (Valor 4)(Let "y" (Valor 3) (Aplicacao "add" (Valor 3)))
107 changes: 0 additions & 107 deletions Linguagens/LFCFT.hs

This file was deleted.

86 changes: 0 additions & 86 deletions Linguagens/LFLE01E.hs

This file was deleted.

79 changes: 0 additions & 79 deletions Linguagens/LFLE01EMP.hs

This file was deleted.

0 comments on commit 34e3990

Please sign in to comment.