• No results found

cifica¸c˜ao sint´atica da linguagem Notus cont´em produ¸c˜oes sint´aticas para essas cons- tru¸c˜oes e foram criadas interfaces de implementa¸c˜ao para as demais etapas, para per- mitir a extens˜ao da vers˜ao atual de forma a suportar totalmente as novas constru¸c˜oes. Assim, o processo de extens˜ao do compilador consiste em implementar as fases de an´alise semˆantica e gera¸c˜ao de c´odigo para essas novas constru¸c˜oes.

5.10

Transformadores de M´odulos

Transformador de m´odulos ´e uma constru¸c˜ao de Notus que permite a extensibilidade e a escalabilidade nas defini¸c˜oes da semˆantica de linguagens de programa¸c˜ao. Por exem- plo, uma especifica¸c˜ao escrita em semˆantica denotacional direta pode ser transformada em uma especifica¸c˜ao com semˆantica de continua¸c˜oes, por meio da inclus˜ao de um ´

unico m´odulo, que define, via um transformador de m´odulos, como as equa¸c˜oes exis- tentes passam a ser tratadas. A vers˜ao atual do compilador Notus, apresentada neste trabalho, n˜ao implementa as constru¸c˜oes de extensibilidade da especifica¸c˜ao semˆantica, constituindo-se em trabalho futuro a extens˜ao do compilador para suporte dessas cons- tru¸c˜oes.

A princ´ıpio, duas alternativas s˜ao vislumbradas para a incorpora¸c˜ao da trans- forma¸c˜ao de m´odulos na atual vers˜ao do compilador Notus. A primeira consiste em compilar os transformadores gerando um m´odulo Haskell capaz de transformar a AST do restante da especifica¸c˜ao. A AST transformada seria novamente reinserida no com- pilador Notus. O problema dessa solu¸c˜ao ´e estabelecer representa¸c˜oes equivalentes da AST e formas de comunica¸c˜ao entre os nodos da AST no compilador Notus e os nodos da AST em Haskell. Uma segunda alternativa ´e implementar um interpretador para os transformadores de m´odulos de forma que seja poss´ıvel alterar os nodos da AST no compilador Notus. A AST transformada seria ent˜ao fornecida como entrada para o gerador de c´odigos. O problema dessa solu¸c˜ao ´e o custo de se projetar e implementar um interpretador para esse fim.

As Figuras 5.43 e 5.44 esquematizam essas duas alternativas. Os processos e dados sombreados constituem a extens˜ao a ser implementada. Existe uma interse¸c˜ao entre essas alternativas. A id´eia comum a elas diz respeito `a constru¸c˜ao de 3 AST’s: (1) AST contento os identificadores dos m´odulos a serem transformados e das fun¸c˜oes transfor- madoras a serem aplicadas a esses m´odulos, obtida a partir das cl´ausulas de importa¸c˜ao; (2) AST das fun¸c˜oes transformadoras; e (3) o restante da AST da especifica¸c˜ao. Al´em disso, nas duas alternativas ´e necess´ario que seja verificada a consistˆencia das aplica¸c˜oes de transforma¸c˜ao nos m´odulos de uma especifica¸c˜ao a partir das informa¸c˜oes do item (1)

Transformer Graph L Specification M1, M2, ... Mn Syntactic Analyzer (Java CUP) AST transform functions Consistency Analyzer Specification Closure Calculation Compilation Error

Non Consistent Consistent

Semantic Definition for transformer constructions Semantic

Domains

Function Definitions

Semantic Translator

AST without transformer constructions

Semantic Definition for transformer constructions Semantic Domains Function Definitions Semantic Translator Main.hs (L semantic interpreter) AST modules importation Transformer Graph Creator ASTTransformer.hs AST_to_File AST file AST_Transformed file File_to_AST Specification Closure Set

Figura 5.43: Diagrama esquem´atico da implementa¸c˜ao de transforma¸c˜ao de m´odulos utilizando um m´odulo Haskell transformador.

5.10. Transformadores de M´odulos 153 Transformer Graph L Specification M1, M2, ... Mn Syntactic Analyzer (Java CUP) AST transformer functions Consistency Analyzer Specification Closure Calculation Compilation Error

Non Consistent Consistent

Transformer Interpreter Specification

Closure Set

AST without transformer functions Semantic Definition (transformed specification) Semantic Domains Function Definitions Semantic Translator Main.hs (L semantic interpreter) AST modules importation Transformer Graph Creator

Figura 5.44: Diagrama esquem´atico da implementa¸c˜ao de transforma¸c˜ao de m´odulos utilizando um interpretador de transformadores.

supra-descrito. Nas alternativas apresentadas, as aplica¸c˜oes de transforma¸c˜ao s˜ao mo- deladas por meio do grafo de aplica¸c˜ao de transforma¸c˜oes, que ´e um grafo dirigido e ro- tulado G = (V, E), tal que V ´e o conjunto dos m´odulos da especifica¸c˜ao, e o conjunto de arestas ´e definido como E = {(m1, m2) ∈ V ×V | o m´odulo m1 importa o m´odulo m2}.

Cada aresta em E ´e rotulada pela fun¸c˜ao de transforma¸c˜ao utilizada na importa¸c˜ao, ou pela fun¸c˜ao identidade i, se a importa¸c˜ao n˜ao definir transforma¸c˜ao a ser aplicada. Por exemplo, o grafo de aplica¸c˜ao de transforma¸c˜oes referente aos m´odulos da Se¸c˜ao 3.9 ´e o mostrado na Figura 5.45.

ONML HIJKMc t  ONML HIJKMd i oo t  ONML

HIJKMa ONMLHIJKMb

Figura 5.45: Grafo de transforma¸c˜ao para a especifica¸c˜ao da Figura 3.2 na P´agina 57

Os caminhos entre os v´ertices do grafo definem a sequˆencia de aplica¸c˜oes de fun¸c˜oes de transforma¸c˜ao aos m´odulos do grafo. O grafo criado ´e analisado quanto `a sua con- sistˆencia. O teste da consistˆencia verifica, para os caminhos n˜ao nulos existentes entre dois m´odulos, por exemplo entre m1 e m2, se esses caminhos s˜ao formados pela mesma

seq¨uˆencia de fun¸c˜oes de transforma¸c˜ao. Esta condi¸c˜ao garante que a interpreta¸c˜ao de cada elemento do m´odulo m2 no m´odulo m1 ´e unicamente definida. Ap´os a ve-

rifica¸c˜ao de consistˆencia, gera-se o fecho da especifica¸c˜ao que apresenta, para cada m´odulo, a seq¨uˆencia de fun¸c˜oes a serem aplicadas aos seus elementos. Por exemplo, para o grafo de transforma¸c˜ao da Figura 5.45 em que o conjunto de m´odulos ´e dado por M = {Ma, Mb, Mc, Md}, o fecho da especifica¸c˜ao M′ ´e o conjunto:

M′ = {(t) M

a, (t) Mb, Mc, Md}

O diagrama da Figura 5.43 apresenta de forma esquem´atica a compila¸c˜ao dos trans- formadores de m´odulos utilizando-se um m´odulo Haskell transformador da AST do restante da especifica¸c˜ao. O m´odulo transformador ´e gerado a partir da compila¸c˜ao das fun¸c˜oes de transforma¸c˜ao da especifica¸c˜ao. A AST do restante da especifica¸c˜ao ´e gravada em arquivo, e o m´odulo transformador lˆe a AST e, em conjunto com o fecho de transforma¸c˜ao, aplica as transforma¸c˜oes na AST e armazena em arquivo a AST transformada. Essa AST ´e reinserida no compilador Notus, que ent˜ao a traduz para o interpretador semˆantico da linguagem especificada.