1 / 11

Análise Sintática Ascendente ­ BottomUp

Análise Sintática Ascendente ­ BottomUp. Bottom Up: (empilha-reduz). Constrói a árvore de derivação de baixo para cima, das folhas para raíz; - Produz uma derivação mais à direita para uma cadeia de entrada;. Processo de redução de uma string X para o símbolo inicial da gramática;

kylee
Download Presentation

Análise Sintática Ascendente ­ BottomUp

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Análise Sintática Ascendente ­ BottomUp

  2. Bottom Up: (empilha-reduz) • Constrói a árvore de derivação de baixo para cima, das folhas para raíz; • - Produz uma derivação mais à direita para uma cadeia de entrada; • Processo de redução de uma string X para o símbolo inicial da gramática; • Em cada passo da redução, uma substring é associada com o corpo de uma produção e obtém-se a parte principal dessa produção; • Decisões chave: quando reduzir e quais produções utilizar; • - Por definição, redução é o inverso da derivação. • Obs: bottom up parsing constrói uma derivação em modo reverso.

  3. Operações lícitas: – empilha (shift): coloca no topo da pilha o símbolo que está sendo lido e avança o cabeçote de leitura na string; – reduz (reduce): substitui o handle no topo da pilha pelo não terminal correspondente; – aceita: reconhece que a sentença foi gerada pela gramática; – erro: ocorrendo erro de sintaxe, chama uma subrotina de atendimento a erros;

  4. Poda do Handle • Handle é uma subcadeia que “casa” com o corpo de uma produção e cuja redução representa um passo da derivação mais à direita ao inverso; • -Uma derivação mais à direita em ordem reversa pode ser obtida pela “poda do handle” • 1. Iniciar com uma string de terminais “w”. Se “w” é uma sentença da gramática dada, então w=yn onde “yn” é a n-ésima forma sentencial mais à direita de alguma derivação mais à direita desconhecida; • 2. Para reconstruir a derivação, localizar handle Bn em “yn” e substituir Bn pelo lado esquerdo da produção An -> Bn para obter a forma sentencial anterior yn-1; • 3. Repetimos esse processo até alcançar o símbolo inicial da gramática. Caso contrário, uma mensagem de erro deve ser gerada.

  5. Analisadores shift-reduce • Forma de análise ascendente onde uma pilha contém símbolos da gramática e um buffer de entrada contém o restante da cadeia a ser reconhecida sintaticamente; • Usa-se o símbolo “$” para marcar o fim da pilha e o último caracter da entrada; • Durante o parsing (da esquerda para direita), o analisador desloca (shift) zero ou mais símbolos de entrada na pilha, até que está pronto para reduzir (reduce) uma string B (no topo da pilha) para a “cabeça” da produção apropriada; • - O analisador sintático repete esse ciclo até encontrar um erro (nenhuma produção é encontrada) ou até que a pilha contém o símbolo de início e a entrada está vazia; Exemplos de algoritmos para o parsing Shift-Reduce (empilha-reduz): – LR(0) – SLR(1) – LR(1) – LALR(1)

  6. Ações em Parsing Empilha-Reduz

  7. Exemplo 1: Passo 1: “A” recebe “c” Passo 2: “B” recebe “ca” Passo 4: “B” recebe “cbB” Solução: S  AB - conflito reduce/reduce

  8. Exemplo 2: Passo 1: “b” recebe “A” Passo 2: “Abc” recebe “A” Passo 3: “d” recebe “B” Passo 4: “aABe” recebe “S” Redução = substituição do lado direito de uma produção pelo não terminal correspondente (lado esquerdo) handle = seqüência de símbolos do lado direito da produção, tais que suas reduções levam, no final, ao símbolo inicial da gramática

  9. Conflitos durante execução do analisador shiftreduce: - Quando o analisador não consegue decidir se deve realizar um shift ou um reduce, temos um conflito shift/reduce; - Quando o analisador não consegue determinar qual redução fazer, temos um conflito reduce/reduce;

  10. Referências: 1. http://www.gpec.ucdb.br/ricrs/Courses/CompilerI/Lectures/Lec06.pdf 2. http://www.inf.ufrgs.br/~nmaillard/pdf/Compiladores08-LR0.pdf 3. http://gersonc.anahy.org/repcomp/Compiladores08-Bottom-up.pdf 4. http://osorio.wait4.org/oldsite/compil/aula-botton-up-parsing.pdf

More Related