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