Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade Federal de Pernambuco Centro de Informática Pós-graduação em Ciência da Computação 2009.1 Documento de escopo do projeto Paradigma de Linguagens de Programação Equipe: Eduardo Almeida – ewma@cin.ufpe.br Fernando Calheiros – fhcl@cin.ufpe.br Flávia Soares – fls@cin.ufpe.br Renata Bezerra – rbsa@cin.ufpe.br Recife, Abril de 2009 1 - Contexto Dentre os padrões de projeto existentes, dois deles são de particular interesse para estruturar o projeto de linguagens: o Interpreter e o Visitor. O primeiro tem como propósito, dada uma linguagem, criar uma representação para a gramática da linguagem, juntamente com um interpretador que usa esta representação para interpretar sentenças na linguagem. O padrão Interpreter usa classes para representar cada regra de uma gramática; sua estrutura é apresentada na Figura 1, seguida da explicação de cada participante. Figura 1 Estrutura do padrão Interpreter – AbstractExpression Define um método abstrato Interpret que será comum a todos os nós em uma árvore sintática. – TerminalExpression Implementa um método Interpret associado a símbolos terminais da gramática. Uma instancia é requerida para todos os símbolos terminais de uma sentença. – NonTerminalExpression Esta classe é requerida para cada regra R::= R1 R2 ... Rn na gramática. Implementa o método Interpret para os símbolos não terminais da gramática. Mantém variáveis do tipo AbstractExpression para cada símbolo R. – Context Contém informações que são globais ao interpretador. – Client Constrói (ou é dada) uma árvore sintática abstrata representando uma sentença particular na linguagem definida pela gramática. Esta árvore sintática é montada através de instancias das classes NonTerminalExpression e TerminalExpression. Chama o método Interpret. O padrão Visitor tem como objetivo representar uma operação a ser realizada nos elementos de uma estrutura de objetos. Ele permite que você defina uma nova operação sem alterar as classes dos elementos nos quais a operação atua. A Figura 2 apresenta a sua estrutura e em seguida seus participantes são detalhados. Figura 2 Estrutura do padrão Interpreter – Visitor Declara uma operação de visita para cada classe de ConcreteElement na estrutura de objetos. O nome da operação identifica a classe que está chamando o Visitor. Desta forma, o Visitor sabe a classe concreta do elemento sendo visitado e pode acessar este objeto por sua interface. – ConcreteVisitor Implementa cada operação declarada pelo Visitor. Cada operação implementa um fragmento do algoritmo definido para a classe correspondente de objetos na estrutura. O ConcreteVisitor pode acumular estado durante a varredura da estrutura de objetos. – Element Define uma operação accept() que recebe um Visitor. – ConcreteElement Implementa uma operação accept() que recebe um Visitor e chama a operação de visita apropriada deste Visitor. – Object Structure Pode enumerar seus elementos. Pode prover uma interface de mais alto nível para que o Visitor visite os elementos. É freqüentemente um Composite, mas pode ser uma coleção simples. � 2 - Objetivo Como o padrão adotado pela disciplina de Paradigmas de Linguagens de Programação é o padrão Interpreter, e existe uma implementação do padrão Visitor na LF2, para dar suporte à utilização de funções de alta ordem (funções podendo ser passadas por parâmetro, e também serem retornadas como um valor), este projeto tem o objetivo de retirar a implementação do Visitor existente em LF2, substituindo por uma implementação representada pelo padrão Interpreter, seguindo o mesmo princípio das demais linguagens implementadas. A BNF da linguagem se mantém, uma vez que a gramática continua a mesma e apenas uma mudança de padrão será realizada. � 3 - Referências [1] http://wiki.les.inf.puc-rio.br/uploads/3/36/Interpreter.pdf [2] http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/pat/visitor.htm
Compartilhar