A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Avaliador de Expressões Luiz Carlos d´Oleron (lcadb)

Apresentações semelhantes


Apresentação em tema: "Avaliador de Expressões Luiz Carlos d´Oleron (lcadb)"— Transcrição da apresentação:

1 Avaliador de Expressões Luiz Carlos d´Oleron (lcadb)

2 O Problema 1. Modelar (sub-conjunto das) expressões da lógica proposicional (sintaxe e propriedades) 2. Avaliar cadeias de caracteres (Strings) contra as regras de formação de expressões 3. A especificação do projeto está em: html html

3 Definido uma expressão Cadeia de caracteres formada com o alfabeto: Cadeia de caracteres formada com o alfabeto: * = {0,1,x,y,z, ),(,.,-,+} E obedecendo as regras de construção E obedecendo as regras de construção

4 Regras para EBF - Expressão Bem Formada 1. Todas expressão atômica é EBF 2. Se E é uma EBF, então (E) também é EBF; 3. Se E1 e E2 são EBF´s então (E1 E2) é também EBF; 4. Nada mais é uma EBF Obs1: : {.,+} Obs2: Esta é só uma pincelada na teoria, todos os detalhes estão nas notas de aula de Ruy

5 Exemplinhos 1 é EBF 1 é EBF x é EBF x é EBF (1.x) é EBF (1.x) é EBF 1.x não é EBF 1.x não é EBF -(1.x) não é EBF -(1.x) não é EBF (-(1.x)) é EBF (-(1.x)) é EBF ((x+1)+z) é EBF ((x+1)+z) é EBF (x+1+z) não é EBF (x+1+z) não é EBF

6 Bem vindo ao mundo Virtual Desafios: Desafios: Adaptar o modelo matemático a uma realidade virtual Adaptar o modelo matemático a uma realidade virtual Para isso usaremos algumas linguagens que não são especializadas para isso: Para isso usaremos algumas linguagens que não são especializadas para isso: Java, C ou C++

7 Modelo de Negócios

8 Exemplo: (x + (-y)) Expressao x = new ExpressaoAtomica(x); Expressao y = new ExpressaoAtomica(y); Expressao negY = new Negacao(y); Expressao ou = new ExpressaoOU(x, negY); String e = ou.representacao(); System.out.println(Altura de + e + : + ou.altura()); System.out.println (Número de operadores de + e + : + ou.numeroOperadores()); Altura de (x+(-y)) : 2 Número de operadores de (x+(-y)) : 2

9 Definição recursiva: representacao() //na classe ExpressaoAtomica String representacao(){ return this.simbolo + ; } //na classe Negacao String representacao(){ return (- + this.getE().representacao() + ); } //na classe ExpressaoE, bem parecido na //ExpressaoOU String representacao(){ return ( + this.getE1().representacao() +. + this.getE2().representacao() + ); }

10 Definição recursiva: altura () //na classe ExpressaoAtomica int altura(){ return 0; } //na classe Negacao int altura(){ return 1 + this.getE().altura(); } //na classe ExpressaoBinaria int altura(){ int a1 = this.getE1().altura(); int a2 = this.getE2().altura(); return 1 + Math.max(a1,a2); }

11 Definição recursiva: numeroOperadores () //na classe ExpressaoAtomica int numeroOperadores(){ return 0; } //na classe Negacao int numeroOperadores(){ return 1 + this.getE().numeroOperadores(); } //na classe ExpressaoBinaria int numeroOperadores(){ int a1 = this.getE1().numeroOperadores(); int a2 = this.getE2().numeroOperadores(); return 1 + a1 + a2; }

12 Definição recursiva: listaSubExpressoes() //na classe ExpressaoAtomica List listaSubExpressoes (){ List retorno = new ArrayList(); //o conjunto de subexpressões de uma expressão //atomica é ela mesma String e = this.representacao(); retorno.add(e); return retorno; } //na classe Negacao List listaSubExpressoes (){ //pega lista de sua sub-expressão List retorno = this.getE(). listaSubExpressoes (); //adiciona a si mesma String e = this.representacao(); retorno.add(e); return retorno; }

13 Definição recursiva: listaSubExpressoes() //na classe ExpressaoBinaria List listaSubExpressoes (){ //pega lista de suas sub-expressões List retorno = this.getE1(). listaSubExpressoes (); List temp = this.getE2(). listaSubExpressoes (); Object o = null; Iterator i = temp.iterator(); while(i.hasNext()){ o = i.next(); //Só adiciona se não contiver if(!retorno.contains(o)){ retorno.add(o); } //adiciona a sim mesma String e = this.representacao(); retorno.add(e); return retorno; }

14 E agora? Já sabemos modelar as estruturas EBF (a parte mais fácil) Já sabemos modelar as estruturas EBF (a parte mais fácil) Só falta fazer o computador ver uma expressão e dizer se ela é válida ou não... Só falta fazer o computador ver uma expressão e dizer se ela é válida ou não...

15 Solução As regras de validação EBF são tão poderosas que vamos usá- las de fora para dentro As regras de validação EBF são tão poderosas que vamos usá- las de fora para dentro Usaremos recursão para: Usaremos recursão para: Dada uma expressão φ qualquer, identificaremos suas sub-expressões (se existirem), validando recursivamente Dada uma expressão φ qualquer, identificaremos suas sub-expressões (se existirem), validando recursivamente

16 Validando expressões Dado φ Dado φ φ é construída com o alfabeto? φ é construída com o alfabeto? Se φ é atômica, é válida Se φ é atômica, é válida Senão, Senão, Ela possui parênteses em número e ordem corretos? Ela possui parênteses em número e ordem corretos? Se possuir, calcularemos o operador raiz* Se possuir, calcularemos o operador raiz* Com o operador raiz em mãos, identificamos a(s) sub-expressão (ões) e repetimos o procedimento nela(s) Com o operador raiz em mãos, identificamos a(s) sub-expressão (ões) e repetimos o procedimento nela(s)

17 Exemplo: ((x+1).(-y)) Construída com o alfabeto Construída com o alfabeto ((x+1).(-y)) não é atômica ((x+1).(-y)) não é atômica 3x( por 3x), começando com ( e terminando com ) 3x( por 3x), começando com ( e terminando com ) Procurando o op. Raiz >. Procurando o op. Raiz >. Agora repetimos os passos com (x+1) e depois com (-y) Agora repetimos os passos com (x+1) e depois com (-y)......

18 Encontrando o operador raiz O operador raiz é o operador que fica na raiz da árvore da expressão: O operador raiz é o operador que fica na raiz da árvore da expressão: Para encontrá-lo vamos contar Para encontrá-lo vamos contar

19 Encontrando o operador raiz 1. Desconsidere o primeiro ( e o último ) 2. Percorra a expressão e vá contando sempre a diferença entre o número de ( e o número de ) 3. O primeiro operador (+,- ou.) que você encontrar quando ( == 0) é o operador raiz.

20 É isso aí. O resto são detalhes de implementação. Leiam atentamente a especificação e testem várias vezes seus programas. Mantenham uma lista de expressões para testes. Boa Sorte


Carregar ppt "Avaliador de Expressões Luiz Carlos d´Oleron (lcadb)"

Apresentações semelhantes


Anúncios Google