Compiladores
Código de Máquina Programa Add v,v,0 cmp v,5 jmplt ELSE THEN: add x, 12,v ELSE: WHILE: cmp x,3 ... v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; } ...... Compilador
Compilador analisador léxico parser entrada saída código de programa máquina programa
Um parser conhece a gramática da linguagem de programação
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
O parser encontra a derivação para uma entrada particular derivação Parser entrada E => E + E => E + E * E => 10 + E*E => 10 + 2 * E => 10 + 2 * 5 E -> E + E | E * E | INT 10 + 2 * 5
árvore de derivação derivação E E => E + E => E + E * E => 10 + E*E => 10 + 2 * E => 10 + 2 * 5 E + E 10 E E * 2 5
árvore de derivação E código de máquina E + E mult a, 2, 5 add b, 10, a 10 E E * 2 5
Parsing
Parser string de entrada derivação gramática
Exemplo: Parser derivação entrada ?
Busca Exaustiva Fase 1: Encontrar derivação Todas as possíveis derivações de comprimento 1
Fase 2 Fase 1
Fase 2 Fase 3
Resultado final da busca exaustiva (top-down parsing) Parser entrada derivação
Complexidade de tempo da busca exaustiva Suponha que não existam produções da forma Número de fases para um string :
Para uma gramática com regras Tempo para a fase 1: possíveis derivações
Tempo para a fase 2: possíveis derivações
Tempo para a fase : possíveis derivações
Extremamente ruim!!! Tempo total requerido para um string : fase 1 fase 2|w| fase 2 Extremamente ruim!!!
Existem algoritmos mais rápidos para tipos especiais de gramáticas S-grammar: símbolo string de variáveis Par ocorre apenas uma vez
S-grammar - exemplo: Cada string tem uma única derivação
Para S-grammars: No parser por busca exaustiva existe uma única escolha em cada fase Tempo para cada fase: Tempo total para parsing de :
Para gramáticas livres de contexto em geral: Existe um algoritmo de parsing que faz parsing de um string em tempo
Simplificações de Gramáticas Livres de Contexto
Regra de Substituição gramática equivalente Substitua B
Em geral: Substitua B gramática equivalente
Produções Inúteis Produção Inútil Algumas derivações nunca terminam...
Outra gramática: Produção inútil Nunca é atingida a partir de S
Em geral: Se Então a variável é útil Caso contrário, a variável é inútil
Uma produção é útil se todas as suas variáveis são úteis
Removendo Produções Inúteis Gramática Exemplo:
Primero: encontre todas as variáveis que produzem strings só com terminais Passo 1: Passo 2:
Mantenha apenas as variáveis que produzem símbolos terminais
Segundo: Encontre todas as variáveis atingíveis a partir de Grafo de Dependência não atingível
Mantenha apenas as variáveis atingíveis a partir de S Gramática Final
Variáveis Nulas Variável Nula:
Removendo Variáveis Nulas Gramática Exemplo: Variável nula
Gramática Final Substitua
Produções Unitárias Produção Unitária:
Removendo Produções Unitárias Observação: É removida imediatamente
Gramática Exemplo:
Substitua
Remova
Substitua
Remova produções repetidas Gramática final
Removendo Tudo Passo 1: Remova Variáveis Nulas Passo 2: Remova Produções Unitárias Passo 3: Remova Variáveis Inúteis