Projeto de PLP Resultado Final Guilherme Oliveira Everton Marques Ricardo Cavalcanti Resultado Final
Objetivos 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 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çã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çã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çã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çã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çã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çã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çã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 Programa ::= Expressao Expressao ::= Valor | ExpUnaria | ExpBinaria | ExpDeclaracao | Id | Aplicacao | IfThenElse Valor ::= ValorConcreto | ValorAbstrato ValorAbstrato ::= ValorFuncao ValorConcreto ::= ValorInteiro | ValorBooleano | ValorString ValorFuncao ::= "fn" Id Id "." Expressao
BNF 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 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 LF3 DeclaracaoFuncional ::= DecVariavel | DecFuncao | DeclaracaoFuncional "," DeclaracaoFuncional DecVariavel ::= "var" Id "=" Expressao DecFuncao ::= "fun" ListId "=" Expressao ListId ::= Id | Id, ListId Aplicacao:= Expressao"(" ListExp ")" ListExp ::= Expressao | Expressao, ListExp
Demonstração