ORIGEM
o
Baseado no padrão interpreter apresentado no livro Design Patterns (GOF)
o
Originalmente apresentado no livro Patterns in Java vol. 1 (GRAND, Mark)
POR QUÊ LITTLE LANGUAGE?
o
Também Conhecida Como Domain Especific Languages (DSL’s)
o
Utilizado quando se tem tarefas recorrentes de dificil execução, então nesse caso
cria-se uma “pequena linguagem” que permita a realização de tais tarefas de
maneira mais simples, talvez não sirva para todas as necessidades, mas com
certeza torna algumas tarefas bem mais simples;
COMO FUNCIONA
o
Cria-se um interpretador para essa “pequena linguagem”. O padrão define uma
estrutura que facilita as operações de analise léxica e sintática, tornando mais
simples a inclusão de regras semânticas, ou outras coisas que permitam
interpretar uma sentença. Implementa a gramática de tal linguagem, que
posteriormente gera uma árvore abstrata que permite identificar sentenças.
CONTEXTO
•
Imagine que você precise escrever um programa que procure em um conjunto de
arquivos para achar arquivos que contenham uma determinada combinação de
palavras. Você não quer escrever um programa para cada busca. Ao invés disso
você define um linguagem que permite ao usuário descrever a combinação de
palavras e então escrever um programa que acha arquivos que contem uma
combinação de palavras especificadas na linguagem.
APLICAÇÃO
o
Quando é necessário tratar tipos de dados similares com um pequeno número
de operações mas inúmeras combinações diferentes
PASSOS PARA O PROJETO
1. Definir a linguagem que será utilizada para a resolução do problema
2. Criar regras léxicas e sintáticas, com suas respectivas regras de produção.
3. Implementação das classes necessárias que implementarão tal linguagem
DIAGRAMA DE CLASSES GENÉRICO
PAPÉIS
o
Client
o
AbstractNonTerminal
o
ConcreteNonTerminal
o
Parser
o
TerminalToken
o
LexicalAnalizer
o
InputStream
COMO FUNCIONA
o
O cliente recebe a sentença a ser interpretada
o
chamada ao método ‘parse’ de Parse que cria a arvore sintática abstrata e a
devolve para o cliente
o
Então o método ‘execute’ é chamado para verificar o resultado da sentença
CONTEXTO
•
Interpretador de expressões algébricas (radiciação e derivações de polinômios
simples). Resolve raízes enésimas no formato “RAIZ radical radicando” e deriva
polinômios simples no formato “3x^3+2x^2-3x+2” e retorna o valor de resultado
OBJETIVO: estender a gramatica para aceitar também potências, no formato “base
ELEVADO expoente”
GRAMATICA ATUAL
•
Expressão -> raiz | derivada
•
Raiz -> ‘raiz’ num num
•
Derivada -> [+|-] termo derivada | ε
•
Num -> 0...9
•
Termo -> [num] letra [^ num]
•
Letra -> a....z A.....Z
GRAMATICA ESTENDIDA
•
Expressão -> raiz | derivada | potenciação
•
Potenciação -> num ‘elevado’ num
•
Raiz -> ‘raiz’ num num
•
Derivada -> [+|-] termo derivada | ε
•
Num -> 0...9
•
Termo -> [num] letra [^ num]
•
Letra -> a....z A.....Z
ESTRUTURA DO INTERPRETADOR
ROTEIRO
•
Fazer testes e verificar funcionamento
•
Reconhecer o token ‘elevado’ no Lexer
•
O método ‘tokenName()’ na classe Parser deve tratar ‘elevado’
•
Acrescentar as regras sintáticas da gramatica final ao parser
•
Criar uma nova classe Potenciação que herda de ExpressãoAlgébrica
(ConcreteNonTerminal)
•
Rodar
Download

ppt