Você está na página 1de 23

Análise Sintática: Métodos Bottom-up

Leonardo Filipe Rigon

Departamento de Ciência da Computação


Centro de Ciências e Tecnologias
Universidade do Estado de Santa Catarina

27 de Março de 2018

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 1 / 23


Introdução: Análise Sintática Bottom-Up:

• Corresponde à segunda etapa de um compilador;


• Utiliza os Tokens gerados pelo Analisador Léxico;
• Cria uma representação intermediária (Árvore Sintática);*
• Verifica, a partir de uma cadeia de Tokens:
• Se é possível gerá-la a partir da linguagem fonte;
• Se não for possível gerar esta cadeia, erros devem ser emitidos;
• Existem 3 tipos de métodos gerais de analisadores sintáticos:
• Métodos Universais de Análise;
• Métodos Top-Down (Descendentes);
• Métodos Bottom-Up (Ascendentes).

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 2 / 23


Introdução: Análise Sintática Bottom-Up:

• A construção da árvore de derivação, se inicia pelas folhas em


direção à sua raiz;
• Consiste na redução de uma cadeia ∆ ao símbolo inicial da
gramática;
• Conseguem expressar a maior parte das linguagens de
programação atuais;
• Exemplos de métodos Bottom-Up:
• Precedência de Operadores;
• LR(1), SLR(1), LALR(1).*

A diferença entre os métodos SLR(1) e LALR(1), está no método


de montagem da Tabela Sintática.

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 3 / 23


Introdução: Análise Sintática Bottom-Up:
Exemplo geral de análise ascendente, começando das folhas
(expressão) indo até o topo (símbolo inicial da gramática).
E
E → E+T |T T
T → T*F |F
F → (E) | id T * F

F * id

id * id

Construção da árvore sintática de derivação da expressão id * id.

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 4 / 23


Métodos LR(k): Análise Sintática Bottom-Up:

• Produz uma derivação mais à direita ao reverso, onde:


• L: Lê a entrada começando pela esquerda;
• R: A derivação correspondente é a mais a direita;
• (k): representa o número de símbolos de entrada a serem
analisados.
• Utiliza uma pilha onde serão colocados terminais, não
terminais e marcadores;
• A dificuldade de implementação do algoritmo está na tomada
de decisão de:
• Quando reduzir uma cadeia de entrada;
• Determinar qual produção deve ser usada para a continuidade
da análise.
• Handle: Consiste em sub-cadeia de símbolos que representa o
lado esquerdo de uma produção.

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 5 / 23


Métodos LR(k): Análise Sintática Bottom-Up:
A estrutura do algoritmo de análise sintática ascendente consiste
em:
• Reconhecer uma cadeia de entrada, através de:
1 Empilhar: colocar os símbolos da cadeia em uma pilha;
2 Reduzir: substituir o lado direito de um produção do topo da
pilha, pelo seu correspondente no lado esquerdo da produção.
• Repetir os passos 1 e 2 até que:
• Percorra-se todos os caracteres da cadeia de entrada e que a
pilha possua apenas o símbolo inicial da gramática ao término
da anpalise, gerando ACEITAÇÃO;
• Por algum motivo o processo seja interrompido, gerando um
ERRO;

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 6 / 23


Métodos LR(k): Tabela Sintática:

Estado: Ação: Desvio:


1. E → E+T c + * ( ) # E T F
2. E → T 0 s5 s4 1 2 3
3. T → T*F 1 s6 OK
4. T → F 2 r2 s7 r2 r2
5. F → (E) 3 r4 r4 r4 r4
6. F → c 4 s5 s4 8 2 3
5 r6 r6 r6 r6
• Shift: 6 s5 s4 9 3
Empilhar; 7 s5 s4 10
• Reduce:
8 s6 11
9 r1 s7 r1 r1
Reduzir.
10 r3 r3 r3 r3
11 r5 r5 r5 r5

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 7 / 23


Métodos LR(k): Algoritmo LR(1 ):

Algorithm 1 Algoritmo LR(1)


1: a := primeiro símbolo da cadeia de entrada w#;
2: while (1) do . repetir indefinidamente
3: s := estado do topo da pilha;
4: if (ACAO[s,a] = "empilha t") then
5: Empilha t;
6: a := próximo símbolo da cadeia de entrada;
7: else if (ACAO[s,a] = "reduz A → β") then
8: Desempilha |β| símbolos;
9: t := topo da pilha;
10: Empilha TRANSICAO[t, A];
11: Imprime "A → β";
12: else if (ACAO[s,a] = OK) then . para a análise
13: Aceita;
14: else erro;
15: end if
16: end while

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 8 / 23


Métodos LR(k): Exemplo → c*c+c

Pilha: Símbolo: Entrada: Ação:


0 c*c+c# s5
05 c *c+c# r6
03 F *c+c# r4
02 T *c+c# s7
027 T* c+c# s5
0275 T*c +c# r6
0275’10’ T*F +c# r3
02 T +c# r2
01 E +c# s6
016 E+ # s5
0165 E+c # r6
0163 E+F # r4
0169 E+T # r1
01 E # OK

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 9 / 23


Métodos LR(k): Exercício Algoritmo LR(1 ):
Utilizando algoritmo LR(1 ) e a tabela a seguir, construir a árvore
de derivação das expressões a baixo:

Expressões: Estado: Ação: Desvio:


c + * ( ) # E T F
1 c+c 0 s5 s4 1 2 3
2 (c + c) * c 1 s6 OK
3 c*c*c 2 r2 s7 r2 r2
3 r4 r4 r4 r4
4 c * (c + c) + c
4 s5 s4 8 2 3
5 c * (c 5 r6 r6 r6 r6
6 s5 s4 9 3
7 s5 s4 10
1. E → E+T
8 s6 11
2. E → T
3. T → T*F 9 r1 s7 r1 r1
4. T → F 10 r3 r3 r3 r3
5. F → (E) 11 r5 r5 r5 r5
6. F → c
Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 10 / 23
Métodos LR(k): Exercício 01 → c+c

Pilha: Símbolo: Entrada: Ação:


0 c+c# s5
05 c +c# r6
03 F +c# r4
02 T +c# r2
01 E +c# s6
016 E+ c# s5
0165 E+c # r6
0163 E+F # r4
0169 E+T # r1
01 E # OK

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 11 / 23


Métodos LR(k): Exercício 02 → (c+c)*c

Pilha: Símbolo: Entrada: Ação:


0 (c+c)*c# s4
04 ( c+c)*c# s5
045 (c +c)*c# r6
043 (F +c)*c# r4
042 (T +c)*c# r2
048 (E +c)*c# s6
0486 (E+ c)*c# s5
04865 (E+c )*c# r6
04863 (E+F )*c# r4
04869 (E+T )*c# r1
048 (E )*c# s11
048’11’ (E) *c# r5
03 F *c# r4
02 T *c# s7
027 T* c# s5
0275 T*c # r6
027’10’ T*F # r3
02 T # r2
01 E # OK
Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 12 / 23
Métodos LR(k): Exercício 03 → c*c*c

Pilha: Símbolo: Entrada: Ação:


0 c*c*c# s5
05 c *c*c# r6
03 F *c*c# r4
02 T *c*c# s7
027 T* c*c# s5
0275 T*c *c# r6
027’10’ T*F *c# r3
02 T *c# s7
027 T* c# s5
0275 T*c # r6
027’10’ T*F # r3
02 T # r2
01 E # OK

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 13 / 23


Métodos LR(k): Exercício 04 → c*(c+c)+c

Pilha: Símbolo: Entrada: Ação:


0 c*(c+c)+c# s5
05 c *(c+c)+c# r6
03 F *(c+c)+c# r4
02 T *(c+c)+c# s7
027 T* (c+c)+c# s4
0274 T*( c+c)+c# s6
02745 T*(c +c)+c# r6
02743 T*(F +c)+c# r4
02742 T*(T +c)+c# r2
02748 T*(E +c)+c# r2
027486 T*(E+ c)+c# s5
0274865 T*(E+c )+c# r6
0274863 T*(E+F )+c# r4
0274869 T*(E+T )+c# r1
02748 T*(E )+c# s11
02748’11’ T*(E) +c# r5
027’10’ T*F +c# r3
02 T +c# r2
01 E +c# s6
016 E+ c# s5
0165 E+c # r6
0163 E+F # r4
0169 E+T # r1
01 E # OK

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 14 / 23


Métodos LR(k): Exercício 05 → c*(c

Pilha: Símbolo: Entrada: Ação:


0 c * (c# s5
05 c * (c# r6
03 F * (c# r4
02 T * (c# s7
027 T* (c# s4
0274 T*( c# s5
02745 T*(c # r6
02743 T*(F # r4
02742 T*(T # r2
02748 T*(E # ERRO

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 15 / 23


Métodos Bottom-Up: Introdução Método SLR

• Aplica-se a uma classe mais restrita de gramáticas;


• Constrói uma tabela sintática SLR;
• Utiliza um conjunto itens LR(0);

Um item LR(0 ) para uma gramática G é uma produção com um


ponto (.), que indica até onde essa produção já foi analisada no
processo de reconhecimento. Exemplo:
• A produção A → XYZ gera 4 itens LR(0):
A → .XYZ (item inicial)
A → X.YZ
A → XY.Z
A → XYZ. (item completo)

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 16 / 23


Métodos Bottom-Up: Itens LR(0), Exemplo:
Construa a coleção de itens LR(0) correspondentes para a
gramática: S → (S)S

S’ → S • S’ → .S
1. S → (S) S • S’ → S.

• S → .(S)S
• S → (.S)S
• S → (S.)S
• S → (S).S
• S → (S)S.

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 17 / 23


Métodos Bottom-Up: Construção da Tabela SLR:
Para a construção da tabela sintática SLR utilizamos duas funções:
• Fechamento, função CLOSURE(I);
• I é um conjunto de itens para uma gramática G. Utilizar as
regras:
1 Inicialmente, acrescente todos os itens de I em CLOSURE(I);
2 Se [A → α.Bβ] estiver em CLOSURE(I) e B → γ for uma
produção, adicionar o item [B → .γ] ao CLOSURE(I), se ainda
não estiver no conjunto. Esta regra deve ser aplicada até que
nenhum outro item possar ser inserido ao CLOSURE(I).
• Desvio ou transição, função GOTO(I,X ):

• Onde I é o conjunto de itens, e X é um símbolo da gramática.


• GOTO(I,X) é o fechamento do conjunto de todos os itens
[A→ αX .β] tais que [A→ α.X β] está em I.

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 18 / 23


Métodos Bottom-Up: Construção da Tabela SLR:

Algorithm 2 Construção conjunto de itens LR(0)


1: C := CLOSURE(S’ →.S#);
2: repeat
3: for (cada conjunto de itens I em C e cada símbolo da gra-
mática X ) do
4: if GOTO(I,X) não for vazio e não estiver em C then
adicione GOTO(I,X) em C;
5: end if
6: end for
7: until não haja mais conjunto de itens a serem adicionados em
C;

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 19 / 23


Exemplo: Autômato LR(0)

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 20 / 23


Métodos Bottom-Up: Construção da Tabela SLR:
Construindo a tabela sintática SLR(1):
• Construir o conjunto de itens C = {I0 , I1 ,...,In };
• Cada estado i é construído a partir de Ii . As ações sintáticas
são determinadas como:
• Se [A→ αaβ] estiver em Ii e GOTO( Ii , a) = Ij então
ACAO[i, a] = Empilhar j (caso a seja um terminal) ou
GOTO[i, a] = Empilhar j (caso a não seja um terminal);
• Se [A→ αaβ] estiver em Ii então aplicar ACAO(i, a) = reduzir
através de A → α, para todo a nos SEGUINTES(A);
• Se [S 0 → S.#] aparecer em Ii então ACAO(i, #).

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 21 / 23


Exercícios:

Construir, através dos algoritmos de fechamento, desvio e da tabela


SLR, a tabela sintática SLR para as seguintes gramáticas:
E → T*F |T
1
F → (F) |c

E → E*T |T
2 T → T+F |F
F → (E) |c

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 22 / 23


Métodos Bottom-Up: Conflitos:
Como a decisão de reduzir, no Método SLR(1), aplicando uma
produção A → α, é tomada utilizando o conjunto de
SEGUINTES(A) e não o contexto de onde α ocorreu, algumas
gramáticas LR(1) podem conter conflitos de Shift/Reduce ao
tentarmos construirmos tabelas utilizando este método.

Para este tipo de gramática, são necessários outros métodos que


utilizem mais informações sobre o contexto.

Leonardo Filipe Rigon 27 de Março de 2018 Análise Sintática: Métodos Bottom-up 23 / 23

Você também pode gostar