4. DEĞERLENDİRME
4.2. Geleneksel Türk evi mimarisinde Yozgat evlerinin yeri
A estrutura da máquina de redução pode ser dividida em três grandes módulos:
módulo de especiĄcação, módulo de transformação e módulo de execução (ou redução).
O módulo de especiĄcação tem a função de descrever a gramática de PEWS, que tem a função de veriĄcar se as descrições das composições atendem às regras descritas na mesma. Em um arquivo, chamado Pews.jacc, são descritas todas as construções sintáti- cas e as respectivas semânticas relacionadas. No anexo deste documento, mostraremos a descrição de toda a gramática de PEWS.
O módulo de transformação contém toda a lógica de transformação das especiĄ- cações PEWS em grafos, deĄnidas na máquina abstrata. Os principais pacotes de códigos relacionados à transformação são os pacotes: pews.parser e pews.grafos. O primeiro pacote, pews.parser, contém as classes responsáveis por fazer as análises léxica e sintá- tica da especiĄcação do usuário. Descrevemos abaixo algumas entidades relacionadas a esse primeiro pacote:
• PewsTokens Ű Descritor dos tokens, que são os caracteres reconhecidos pelas regras da gramática. Este arquivo é gerado automaticamente na construção e compilação da gramática, deĄnida pelo arquivo Pews.jacc;
• PewsParser Ű Responsável por realizar a análise sintática e chamar as constru- ções semânticas relacionadas. Este arquivo também é gerado automaticamente na construção e compilação da gramática;
• PewsLexer Ű Analisador Léxico da composição. A saída desta classe é usada como entrada na classe PewsParser. Diferentemente das anteriores, este arquivo é deĄnido pelo usuário;
• Token Ű Superclasse abstrata que representa todos os símbolos da gramática, onde todos são considerados um Token. Estes são transformados em objetos concretos quando é encontrado um determinado padrão sintático;
• TInt e TStringŰ Classes auxiliares usadas no momento da transformação dos to- kens em tipos reais, que são utilizados pela máquina. Estas classes estendem a classe Token. A classe TInt é usada para tipos inteiros e a classe TString é usada para tipos Strings.
Figura 20 Ű Classes TInt e TString
Já o pacote pews.grafos é o maior pacote existente. Ele contém a descrição de todos os tipos de vértices, ou seja, nas chamadas semânticas, sempre algum elemento desta classe é utilizado para que a transformação da especiĄcação em grafos seja realizada. As duas classes principais são: Grafo e Vertice, onde ambas estendem a superclasse Token. A classe Grafo é a classe que é chamada em todas as construções da estrutura dos grafos, ou seja, é a chamada semântica de cada padrão sintático referente à construção do grafo propriamente dito (neste caso, não entram a construção de expressões). Ela possui vários tipos de construtores, sendo alguns usados para mais de uma estrutura (por exemplo, sequências e paralelismo). Já a classe Vertice contém as informações gerais sobre todos os tipos de vértices, como o número de arestas de controle, dependência, etc. Muitos vértices apresentam algumas peculiaridades, porém todos possuem os atributos e métodos da classe vértice. Dessa forma, a descrição de cada classe de vértice estende a especiĄcação da classe Vertice. Citaremos brevemente cada uma das classes que representam os vértices: • Chamada Ű Classe que representa vértices do tipo S! ¯E. Seus atributos principais
são:
private String nomeDoServico; // Nome do serviço de chamada private Expressao expressoes; // Tupla de expressoes ¯E
4.1. A Máquina de Redução Original 69
private Variavel variavel; // Variável de saída representada por S? ¯X
• Retorno Ű Classe que representa vértices do tipo S? ¯X. Seus atributos principais
são:
private String nomeDoServico; // Nome do serviço de chamada
private List<String> listaDeVariaveis; // Tupla de variáveis de saída ¯X
• Soma Ű Classe que representa vértices do tipo Ś+Š (escolha não-determinística). Todos os elementos que estendem a classe vértice possuem um atributo chamado idhashCodeSoma, que identiĄca se ele está dentro do âmbito de um vértice Ś+Š (assume o valor -1 no caso de sua execução não estar relacionada com a avaliação de nenhuma expressão). Este valor será o mesmo idhashCodeSoma do vértice Ś+Š correspondente;
• Expr Ű Classe de vértices que representam as expressões. Na máquina, estes vértices são sempre antecedidos de um vértice Ś+Š. Seu único atribulo é List<Expressao> listaDeExpressoes, que indica a expressão numérica a ser avaliada para o retorno positivo (true) ou negativo (false);
• Expressao Ű São as expressões propriamente ditas. Esta classe não é um vértice, porém é de grande importância, pois é a classe que representa a chamada semântica de cada padrão sintático referente à construção das expressões (semelhante à classe Grafo);
• Mu Ű Classe que representa os vértices de repetições (Unfolding).
• Unfold Ű Classe que representa os vértices Unfold, que serve como ponto de refe- rência para cópia do subgrafo que está dentro do âmbito de um vértice Unfolding, ou seja, o subgrafo P da construção Unfolding P;
Na Ągura 21, temos a hierarquia com as novas classes apresentadas:
O último módulo a ser apresentado é o módulo de execução, que contém toda a lógica de execução da máquina de redução. Os dois pacotes responsáveis por toda essa lógica são: pews.main e pews.maquina. O pacote pews.main contém apenas a classe Main, cuja função é chamar o analisar léxico e o analisador sintático. Já o pacote pews.maquina contém a classe Maquina, que possui um conjunto de atributos e métodos responsáveis pela execução propriamente dita do grafo da composição. Ela é chamada no último passo da recursão da gramática do parser. Em virtude de sua extensão, iremos resumir algumas explicações sobre esta classe. Os atributos dessa classe são:
Figura 21 Ű Hierarquia de classes do pacote pews.grafos
• todosOsVertices Ű Este atributo é o responsável por guardar todos os vértices da máquina de redução. Considerando a máquina hhV, Ac, Adi ρ, I, Oi, este atributo corresponde ao elemento V da máquina;
• minimals Ű Atributo que indica quais vértices podem ser avaliados, ou seja, os vértices mínimos;
• listaDeOutIn Ű Atributo que guarda as informações dos bufers de entrada (I) e saída (O) da máquina de redução. Objetos desta classe são criados no momento da execução de vértices de chamada, onde uma nova instância deste objeto é criada para guardar as informações recebidas após a execução de um serviço;
• ambiente Ű Representa o ambiente global de variáveis. No momento em que um serviço é executado, ele gera (ou possivelmente altera) o valor de uma variável no ambiente;
• escolhido Ű Vértice escolhido para a avaliação. Todos os vértices escolhidos para serem avaliados devem estar também presentes no conjunto minimals;
• exprCheck Ű Parâmetro auxiliar que indica o número de vértices avaliados pela máquina de redução;
Quando o último passo da recursão é realizado e a máquina de redução é criada, todo o grafo deve estar construído, juntamente com as informações sobre arestas de con- trole e dependência. A partir daí, o construtor desta classe é chamado. A classe Maquina possui um método print. Este método é o responsável por mostrar todas as informações textuais sobre a situação da máquina no início, durante e no Ąm de sua execução. As informações gerais que são mostradas em cada chamada deste método são: quantidade de
4.2. A Máquina de Redução Estendida 71