Resultado Final Projeto de PLP Guilherme Oliveira Everton Marques Ricardo Cavalcanti.
Transcript of Resultado Final Projeto de PLP Guilherme Oliveira Everton Marques Ricardo Cavalcanti.
Resultado FinalResultado Final
Projeto de PLP
Guilherme OliveiraEverton Marques
Ricardo Cavalcanti
ObjetivosObjetivos
Corrigir algumas falhas remanescentes da Linguagem Funcional 2
Listas – Cons: e : L– Concatenação: L1^^L2– Operações: head(L) e tail(L)
• Compreensão de Lista– [exp | qualificador,...,qualificador],
• exp é uma expressão • qualificador é uma condição ou um gerador da
forma x lista
Resultados AnterioresResultados Anteriores
Bugs conhecidos das linguagens LF1 e LF2 foram corrigidos e alguns trechos de código foram reescritos para melhorar a compreenção.
Listas (Criação da LF3)– Cons: e : L– Concatenação: L1^^L2– Operações: head(L) e tail(L)
Resultados da 2ª iteraçãoResultados da 2ª iteração
• Corrigindo bug do seguinte tipo:• let var suc = fn x . x+1,
var pred = fn x . x-1,var id = fn x . x in suc(pred(2)) == id(2)
• Correção feita no parser
Resultados da 2ª iteraçãoResultados da 2ª iteração
• Inclusão das expressões binárias maiorQue(>),menorQue(<), multi (*).
• O checaTipo delas exige que as duas expressões sejam inteiras quando avaliadas.
• Criadas para ajudar na utilização de compreensão de lista
Resultados da 2ª iteraçãoResultados da 2ª iteração
• Inclusão de “..” como um operador binário que recebe duas Expressões e retorna uma lista.
• O checaTipo dele exige que as duas expressões sejam inteiras quando avaliadas.
• Exemplo: 1..5 vai resultar [1,2,3,4,5];
Resultados da 2ª iteraçãoResultados da 2ª iteração
• Compreensão de Lista– [exp g, ..., g f],
• exp é uma expressão • g é um gerador da forma x lista • f é um filtro
• Nova Expressão CompreensaoLista que é criada a partir de uma Expressão, uma lista de geradores e um filtro (expressão booleana). Um gerador é composto de um id e uma lista.
Resultados da 2ª iteraçãoResultados da 2ª iteração
• Durante a execução o id utilizado no gerador vai virar uma variável no ambiente. As variáveis dos geradores podem ser utilizadas na expressão inicial, e no filtro.
• A expressão inicial serve pra gerar a lista em si, o gerador diz de onde cada variável vem, e o filtro diz se a variável deve ser inclusa.
Resultados da 2ª iteraçãoResultados da 2ª iteração
• O checaTipo da CompreensaoLista verifica se o tipo interno da lista utilizada no gerador é igual ao tipo do id usado no gerador, baseado na expressão utilizada na lista.Verifica se a expressão é bem formada, e se o filtro é booleano.
• Pra avaliar a compreensão da lista, as possíveis combinações (múltiplos geradores) é gerada RECURSIVAMENTE, incrementando o ambiente e inserindo as constantes no ambiente.
Resultados da 2ª iteraçãoResultados da 2ª iteração
• Exemplo:• [ [x,y] for x in [1,2,3] for y in [4,5,6] ]• Resultado: [[1,4],[1,5],[1,6],[2,4],[2,5],
[2,6],[3,4],[3,5],[3,6]]
BNF da LF3 BNF da LF3
Programa ::= ExpressaoExpressao ::= Valor | ExpUnaria
| ExpBinaria| ExpDeclaracao| Id| Aplicacao| IfThenElse
Valor ::= ValorConcreto | ValorAbstratoValorAbstrato ::= ValorFuncaoValorConcreto ::= ValorInteiro | ValorBooleano | ValorStringValorFuncao ::= "fn" Id Id "." Expressao
BNF da LF3BNF da LF3
ExpUnaria ::= "-" Expressao | "not" Expressao
| "length" Expressao| "head(" Expressao ")"| "tail(" Expressao ")"| ExpCompreensaoLista
ExpCompreensaoLista ::= Expressao Gerador| Expressao Gerador Filtro
Gerador ::= “for” Id “in” Expressao| “for” Id “in” Expressao “,” Gerador
Filtro ::= “if” Expressao
BNF da LF3BNF da LF3
ExpBinaria ::= Expressao "+" Expressao | Expressao "-" Expressao| Expressao "*" Expressao| Expressao "and" Expressao| Expressao "or" Expressao| Expressao ">" Expressao| Expressao ">" Expressao | Expressao "==" Expressao| Expressao "++" Expressao| Expressao ":" Expressao| Expressao "^^" Expressao| Expressao ".." Expressao
ExpDeclaracao ::= "let" DeclaracaoFuncional "in" Expressao
BNF da LF3BNF da LF3
DeclaracaoFuncional ::= DecVariavel| DecFuncao| DeclaracaoFuncional "," DeclaracaoFuncional
DecVariavel ::= "var" Id "=" ExpressaoDecFuncao ::= "fun" ListId "=" ExpressaoListId ::= Id | Id, ListIdAplicacao:= Expressao"(" ListExp ")"ListExp ::= Expressao | Expressao, ListExp
Demonstração