Compiladores 1 Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; } ...... Código de Máquina Compilador Add v,v,0 cmp v,5 jmplt ELSE THEN: add x, 12,v ELSE: WHILE: cmp x,3 ... 2 Compilador analisador léxico entrada programa parser saída código de máquina 3 Um parser conhece a gramática da linguagem de programação 4 Parser PROGRAM STMT_LIST STMT_LIST STMT; STMT_LIST | STMT; STMT EXPR | IF_STMT | WHILE_STMT | { STMT_LIST } EXPR EXPR + EXPR | EXPR - EXPR | ID IF_STMT if (EXPR) then STMT | if (EXPR) then STMT else STMT WHILE_STMT while (EXPR) do STMT 5 O parser encontra a derivação para uma entrada particular derivação entrada 10 + 2 * 5 Parser E -> E + E |E*E | INT E => E + E => E + E * E => 10 + E*E => 10 + 2 * E => 10 + 2 * 5 6 árvore de derivação derivação E => E + E => E + E * E => 10 + E*E => 10 + 2 * E => 10 + 2 * 5 E E 10 + E 2 E * E 5 7 árvore de derivação E E 10 código de máquina + E 2 E * mult a, 2, 5 add b, 10, a E 5 8 Parsing 9 string de entrada Parser gramática derivação 10 Exemplo: Parser entrada aabb S SS S aSb S bSa S derivação ? 11 Busca Exaustiva S SS | aSb | bSa | Fase 1: S SS S aSb Encontrar derivação aabb S bSa S Todas as possíveis derivações de comprimento 1 12 S SS S aSb aabb S bSa S 13 Fase 2 S SS | aSb | bSa | S SS SSS S SS aSbS Fase 1 S SS S aSb aabb S SS bSaS S SS S S aSb aSSb S aSb aaSbb S aSb abSab S aSb ab 14 S SS | aSb | bSa | Fase 2 S SS SSS S SS aSbS aabb S SS S S aSb aSSb S aSb aaSbb Fase 3 S aSb aaSbb aabb 15 Resultado final da busca exaustiva (top-down parsing) Parser entrada aabb S SS S aSb S bSa S derivação S aSb aaSbb aabb 16 Complexidade de tempo da busca exaustiva Suponha que não existam produções da forma A A B Número de fases para um string w : 2| w| 17 Para uma gramática com Tempo para a fase 1: k regras k k possíveis derivações 18 Tempo para a fase 2: k 2 k 2 possíveis derivações 19 Tempo para a fase 2| w| : k 2|w| 2|w| possíveis derivações k 20 Tempo total requerido para um string k k k 2 fase 1 fase 2 w: 2|w| fase 2|w| Extremamente ruim!!! 21 Existem algoritmos mais rápidos para tipos especiais de gramáticas S-grammar: A ax símbolo Par string de variáveis ( A, a) ocorre apenas uma vez 22 S-grammar - exemplo: S aS S bSS S c Cada string tem uma única derivação S aS abSS abcS abcc 23 Para S-grammars: No parser por busca exaustiva existe uma única escolha em cada fase Tempo para cada fase: 1 Tempo total para parsing de w : | w| 24 Para gramáticas livres de contexto em geral: Existe um algoritmo de parsing que faz parsing de um string w 3 em tempo | w | 25 Simplificações de Gramáticas Livres de Contexto 26 Regra de Substituição gramática equivalente Aa A aaA A abBc B abbA Bb Substitua B Aa A aaA A ababbAc A abbc 27 Em geral: A xBz B y1 | y2 | | yn Substitua B A xy1z | xy2 z | | xyn z gramática equivalente 28 Produções Inúteis S aSb S SA A aA Produção Inútil Algumas derivações nunca terminam... S A aA aaA aaaA 29 Outra gramática: SA A aA A B bA Produção inútil Nunca é atingida a partir de S 30 Em geral: Se S xAy w w L(G ) Então a variável A é útil Caso contrário, a variável A é inútil 31 Uma produção A x é útil se todas as suas variáveis são úteis 32 Removendo Produções Inúteis Gramática Exemplo: S aS | A | C Aa B aa C aCb 33 Primero: encontre todas as variáveis que produzem strings só com terminais S aS | A | C Aa Passo 1: { A, B} Passo 2: { A, B, S} B aa C aCb 34 Mantenha apenas as variáveis { A, B, S} que produzem símbolos terminais S aS | A | C Aa B aa C aCb S aS | A Aa B aa 35 Segundo: Encontre todas as variáveis atingíveis a partir de S Grafo de Dependência S aS | A Aa B aa S A B não atingível 36 Mantenha apenas as variáveis atingíveis a partir de S S aS | A Aa B aa Gramática Final S aS | A Aa 37 Variáveis Nulas l - produção: A Variável Nula: A 38 Removendo Variáveis Nulas Gramática Exemplo: S aMb M aMb M Variável nula 39 Gramática Final S aMb M aMb M Substitua M S aMb S ab M aMb M ab 40 Produções Unitárias Produção Unitária: A B 41 Removendo Produções Unitárias Observação: A A É removida imediatamente 42 Gramática Exemplo: S aA Aa A B BA B bb 43 S aA Aa A B BA B bb Substitua A B S aA | aB Aa B A| B B bb 44 S aA | aB Aa B A| B B bb Remova BB S aA | aB Aa BA B bb 45 S aA | aB Aa Substitua BA BA B bb S aA | aB | aA Aa B bb 46 Remova produções repetidas Gramática final S aA | aB | aA S aA | aB Aa Aa B bb B bb 47 Removendo Tudo Passo 1: Remova Variáveis Nulas Passo 2: Remova Produções Unitárias Passo 3: Remova Variáveis Inúteis 48