• Nenhum resultado encontrado

3.7 Especifica¸c˜ao Semˆantica

3.7.3 Padr˜oes

Padr˜oes s˜ao utilizados para a realiza¸c˜ao de casamento de padr˜ao, onde o valor de uma express˜ao ´e comparado `a estrutura do padr˜ao. Padr˜oes s˜ao usados em:

• defini¸c˜oes de fun¸c˜oes, como parˆametros a serem casados com os argumentos de uma express˜ao de aplica¸c˜ao de fun¸c˜ao;

• express˜oes de casamento de padr˜ao, para inspe¸c˜ao de tipo de uma express˜ao; • vari´aveis das express˜oes let, where, case e abstra¸c˜ao lambda.

Os padr˜oes existentes em Notus s˜ao valor literal, identificador, agregado tupla, agregado lista, e n´o de AST.

Padr˜oes literais. Padr˜oes literais casam apenas com seus respectivos valores, como ´e o caso do padr˜ao 0 da primeira defini¸c˜ao de fact da Listagem 3.16.

Padr˜oes Identificadores. Os padr˜oes identificadores podem casar com quaisquer valores respeitando as poss´ıveis varia¸c˜oes definidas a seguir. Esses padr˜oes podem declarar:

• elementos de enumera¸c˜ao, que casam apenas com o elemento da enumera¸c˜ao a que se referem;

• identificadores decorados representando elementos de dom´ınios, que casam apenas com valores do dom´ınio que representam. O dom´ınio ´e obtido ignorando-se a decora¸c˜ao e capitalizando-se a primeira letra do identificador;

• identificadores n˜ao-declarados, que, a princ´ıpio, podem representar elementos de quaisquer dom´ınios especificados, casam apenas com valores de um dom´ınio de- pendente do contexto em que se encontram;

• identificadores anˆonimos, representados pelo caractere ‘ ’, casam com qualquer valor. Esses padr˜oes n˜ao s˜ao associados ao valor casado.

A fun¸c˜ao sum da Listagem 3.17 exemplifica o uso de identificadores elementos de enumera¸c˜ao com o padr˜ao error, o uso de identificadores decorados de elementos de dom´ınio, com os padr˜oes int1 e int2, e o uso do identificador anˆonimo ‘_’.

✞ 1 V a l u e = I n t | { e r r o r } ; 2 3 f u n c t i o n sum : V a l u e −> V a l u e −> V a l u e ; 4 sum i n t 1 i n t 2 = i n t 1 + i n t 2 ; 5 sum e r r o r = e r r o r ; 6 sum e r r o r = e r r o r ; 7 sum = e r r o r ; ✠ ✝ ✆

Listagem 3.17: Exemplo de padr˜oes identificador em defini¸c˜ao de fun¸c˜ao. Os identificadores aen nas defini¸c˜oes das fun¸c˜oes fact epow da Listagem 3.16 s˜ao exemplos de padr˜oes com identificadores n˜ao-declarados, ou seja, seu tipo ´e inferido pelo contexto.

Padr˜ao Agregado Tupla. O padr˜ao tupla casa com valores de um dom´ınio tupla ´e representado pelo construtor da tupla seguido pelos seus elementos entre parˆenteses e separados por v´ırgula. A Listagem 3.18 exemplifica a utiliza¸c˜ao de padr˜oes de tupla em defini¸c˜oes de fun¸c˜ao. O dom´ınio P representa um par ordenado com coordenadas inteiras. A fun¸c˜aoquadrantdetermina qual ´e o quadrante do plano cartesiano em que se encontra um determinado ponto representado por um par ordenado no dom´ınio P. Se as coordenadas forem ambas iguais a 0, o par est´a na origem do plano cartesiano. Caso contr´ario, a fun¸c˜ao quadranttesta os valores do par determinando sua posi¸c˜ao.

3.7. Especificac¸˜ao Semˆantica 45 ✞ 1 P = ( I n t , I n t ) ; 2 f u n c t i o n q u a d r a n t : P −> S t r i n g ; 3 q u a d r a n t P ( 0 , 0 ) = " origin " ; 4 q u a d r a n t P( x , y ) = i f ( x>0 and y >0) 5 then " quadrant 1" 6 e l s e i f ( x<0 and y <0) 7 then " quadrant 3" 8 e l s e i f ( x>0 and y <0) 9 then " quadrant 2" 10 e l s e " quadrant 4"; ✠ ✝ ✆

Listagem 3.18: Exemplo de padr˜ao tupla em defini¸c˜ao de fun¸c˜ao.

Padr˜ao Agregado Lista. O padr˜ao lista casa com valores lista determinados pelo casamento seq¨uencial, ou pelo casamento com identificadores de lista decorados, ou por casamento de cabe¸ca/cauda (head/tail ) de lista.

No casamento seq¨uencial os elementos s˜ao listados entre parˆenteses e separados por v´ırgula. Na Listagem 3.19, a fun¸c˜ao listP mapeia uma lista de inteiros em uma nova lista de inteiros de acordo com os elementos da lista de argumento; se o argumento for uma lista vazia ent˜ao uma lista vazia ´e retornada; sen˜ao, se o argumento ´e a lista

(1,2,3) ent˜ao a lista (1,2,5) ´e retornada; sen˜ao se o argumento ´e uma lista com trˆes elementos, e o primeiro ´e 1 e o ´ultimo ´e 3, ent˜ao ´e retornada a lista argumento substituindo-se apenas o ´ultimo elemento para 4; e, finalmente, se o argumento ´e uma lista em que o primeiro elemento ´e 1 e o segundo e quarto s˜ao ambos 2, ent˜ao a lista

(1,2,2) ´e retornada. De forma an´aloga, a fun¸c˜ao listP2 mapeia qualquer lista no formato ((1), (), (x,y)) em uma lista(1,x + y).

✞ 1 f u n c t i o n l i s t P : I n t ∗ −> I n t ∗ ; 2 l i s t P ( ) = ( ) ; 3 l i s t P ( 1 , 2 , 3 ) = ( 1 , 2 , 5 ) ; 4 l i s t P ( 1 , x , 3 ) = ( 1 , x , 4 ) ; 5 l i s t P ( 1 , 2 , , 2 ) = ( 1 , 2 , 2 ) ; 6 7 f u n c t i o n l i s t P 2 : I n t ∗∗ −> I n t ∗ ; 8 l i s t P 2 ( ( 1 ) , ( ) , ( x , y ) ) = ( 1 , x + y ) ; ✠ ✝ ✆

Listagem 3.19: Exemplo de padr˜ao de lista com casamento seq¨uencial em defini¸c˜ao de fun¸c˜ao.

O casamento com identificadores de lista decorados ocorre quando um identificador ´e decorado pelos s´ımbolos * ou +. Na Listagem 3.20 a defini¸c˜ao para a fun¸c˜ao listP3

utiliza o padr˜ao de lista decoradobool*para representar uma lista de valores booleanos que, quando casada, gera como resultado a lista (true,true).

1 f u n c t i o n l i s t P 3 : Bool ∗ −> Bool ∗ ; 2 l i s t P 3 b o o l ∗ = ( true , t r u e ) ;

✝ ✆

Listagem 3.20: Exemplo de padr˜ao de lista utilizando casamento com identificadores de lista decorado em uma defini¸c˜ao de fun¸c˜ao.

No casamento de cabe¸ca/cauda, uma lista ´e descrita por um padr˜ao para o seu primeiro elemento (cabe¸ca), e outro para os demais elementos (cauda), separados por dois pontos. A Listagem 3.21 mostra defini¸c˜oes para a fun¸c˜ao listP4, que mapeia

lista de inteiros em outra, utilizando padr˜oes de cabe¸ca/cauda de listas. A primeira defini¸c˜ao apenas mapeia lista vazia em lista vazia. Na segunda defini¸c˜ao casam-se argumentos de tipo lista cujo primeiro elemento ´e o valor 3. As demais defini¸c˜oes de

listP4mostram diferentes padr˜oes de lista.

✞ 1 f u n c t i o n l i s t P 4 : I n t ∗ −> I n t ∗ ; 2 l i s t P 4 ( ) = ( ) ; 3 l i s t P 4 3 : s ∗ = 4 : l i s t P 4 s ∗ ; 4 l i s t P 4 1 : 2 : s ∗ = 1 : 2 : l i s t P 4 s ∗ ; 5 l i s t P 4 i n t : i n t s ∗ = i n t ∗ i n t : l i s t P 4 i n t s ∗ ; ✠ ✝ ✆

Listagem 3.21: Exemplo de padr˜ao de lista com casamento cabe¸ca/cauda em defini¸c˜ao de fun¸c˜ao.

Padr˜ao Nodo de AST. O padr˜ao de nodo de AST ( ´Arvore de sintaxe abstrata) corresponde ao lado direito de uma regra de gram´atica abstrata existente. Esse padr˜ao ´e definido entre colchetes, onde podem aparecer apenas padr˜oes de identificadores, strings entre aspas, e padr˜oes identificador de lista. Por exemplo, considere especifica¸c˜ao da Listagem 3.22, cuja gram´atica abstrata ´e:

Exp → Exp ”+” Exp | Exp ”∗” Exp | I n t

A primeira defini¸c˜ao determina o resultado da fun¸c˜ao de denota¸c˜ao de express˜oes

dExp para um argumento inteiro; a segunda determina o resultado de dExp para uma express˜ao de adi¸c˜ao; e a ´ultima determina o resultado de dExp para uma express˜ao de multiplica¸c˜ao.

3.7. Especificac¸˜ao Semˆantica 47

1

2 token num : Exp = [0 −9]+ i s a s I n t e g e r ; 3

4 exp : : = exp "+" term | term : term ;

5 term : Exp : : = term "*" f a c t o r | f a c t o r : f a c t o r ; 6 f a c t o r : Exp : : = num | "(" exp ")" : exp ;

7

8 f u n c t i o n dExp : Exp −> I n t ; 9 dExp i n t = i n t ;

10 dExp [ exp1 "+" exp2 ] = dExp exp1 + dExp exp2 ; 11 dExp [ exp1 "*" exp2 ] = dExp exp1 ∗ dExp exp2 ;

✝ ✆

Listagem 3.22: Exemplo de padr˜ao de nodo de AST em defini¸c˜ao de fun¸c˜ao.