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;
-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.
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;
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.
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)
Ações em Parsing Empilha-Reduz
Exemplo 1:
Passo 1: “A” recebe “c”
Passo 2: “B” recebe “ca”
Passo 4: “B” recebe “cbB”
Solução: S  AB
- conflito reduce/reduce
Exemplo 2:
Passo 4:
1: “aABe”
2:
3:
“b” recebe
“Abc”
“d”
recebe
recebe
“B”
“A”“A”
“S”
handle = =seqüência
Redução
substituição
de símbolos
do lado direito
do ladodedireito
uma produção
da produção,
pelotais
nãoque
terminal
suas reduções
correspondente
levam, no
(lado ao
final,
esquerdo)
símbolo inicial da gramática
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;
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
Download

Link para o material produzido pelo grupo