Sobrecarga e Declaração de Operadores Rafael Fonseca e Romeu Guimarães.
Transcript of Sobrecarga e Declaração de Operadores Rafael Fonseca e Romeu Guimarães.
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:
1 + 1 + 1 Reconhecido como uma aplicação do operador ternário _:int + _:int + _:int
(1 + 1) + 1 Reconhecido 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
• http://www-cse.ucsd.edu/~goguen/sys/obj.html The OBJ Language Family
• http://www.ldl.jaist.ac.jp/cafeobj/
Sobrecarga e Declaração de Operadores
Rafael Fonseca e Romeu Guimarães