Sobrecarga e Declaração de Operadores Rafael Fonseca e Romeu Guimarães
Roteiro BNF (Principais Mudanças) Limitações Dificuldades Desenvolvimento Exemplos Trabalhos Futuros Referências
BNF (Principais Mudanças) Expressao ::= [ IdOperador ] ( Valor | ExpDeclaracao | IdFuncaoVariavel | Aplicacao | IfThenElse | "(" Expressao ")" ) [ ComplementoOperacao ] ComplementoOperacao ::= ( IdOperador "(" Expressao ")" | IdOperador Expressao | IdOperador ) ListIdOperador ::= ( IdOperador "_:" Tipo [ IdOperador ] | "_:" Tipo IdOperador [ "_:" Tipo ] )+ DecOperador ::= "op" ListIdOperador "on" ListIdFuncaoVariavel "=" Expressao
Limitações Não aceita tipos polimórficos nem ValorFuncao como parâmetros para operadores. Estas restrições não a deixam 100% compatível com a linguagem LF2. Pois quando queremos usar o conceito de uma função como valor não podemos.
Limitações Para conseguir diferenciar o uso de operador (que pode ser binário, ternário e etc) temos que usar os tokens "(" e ")". Assim podemos diferenciar quando está sendo usado um determinado operador. Exemplos: Reconhecido como uma aplicação do operador ternário _:int + _:int + _:int (1 + 1) + 1Reconhecido como duas aplicações do operador binário _:int + _:int
Encontramos algumas dificuldades no desenvolvimento da primeira versão da OperOR. Algumas delas estão listadas abaixo: Replicação de muitas classes da LF2 para mudança de tipos, pois davam conflitos. Encontrar uma maneira de reconhecer a aplicação de operadores. Ter que modificar o funcionamento quase que completo do parser da LF2. Pois agora tinha que reconhecer onde estavam sendo aplicados os operadores. Dificuldades
Desenvolvimento Nesta sessão descreveremos como foi o desenvolvimento da linguagem. Classes Reusadas –Da linguagem funcional 2 (LF2): plp.functional1.declaration.DeclaracaoFuncional plp.functional1.declaration.DecVariavel plp.functional1.expression.IfThenElse –Da Linguagem de Expressões 2 (LE2): plp.expressions2.expression.Expressao plp.expressions2.expression.Valor plp.expressions2.expression.ValorInteiro plp.expressions2.expression.ValorString plp.expressions2.expression.ValorBooleano
Desenvolvimento Classes Modificadas plp.operor.declaration.DecFuncao plp.operor.expression.Aplicacao plp.operor.expression.ExpDeclaracao plp.operor.expression.ValorFuncao plp.operor.util.PartialInstantiatorVisitor
Desenvolvimento Classes Criadas –plp.operor.expression.ValorOperador –plp.operor.expression.Operacao –plp.operor.expression.IdOperador –plp.operor.expression.IdFuncaoVariavel –plp.operor.expression.Aplicacao –plp.operor.declaration.DecOperador –plp.operor.util.ListIdOperador –plp.operor.util.TipoOperador
Exemplo
Trabalhos Futuros Os seguintes trabalhos podem ser desenvolvidos a partir da implementação atual da OperOR: –Estudar uma forma de implementar o funcionamento de operadores de alta ordem. –Implementar uma forma de se definir operadores envolvendo tipos polimorficos. –Estudar como poderia ser implementado o conceito de precedência de operadores. –Implementar recursão de operadores e usar o token "extern" para usar um operador declarado anteriormente. Um código de exemplo seria o listado a seguir, onde o operador de soma que está sendo usado dentro da declaração de operador é um outro operador de soma previamente declarado.
Referências The OBJ Language Familyhttp://www-cse.ucsd.edu/~goguen/sys/obj.html
Sobrecarga e Declaração de Operadores Rafael Fonseca e Romeu Guimarães