130 likes | 227 Views
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).
E N D
Sobrecarga e Declaração de OperadoresRafael 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:
Dificuldades • 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.
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
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 OperadoresRafael Fonseca e Romeu Guimarães