Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouManuel Ian Cabreira Salvado Alterado mais de 7 anos atrás
1
IF688 – Análise Sintática
2
Resumo desta aula Revisão de conceitos gerais de parsing Método de parsing top down e bottom up
3
Analisador Sintático Programa fonte lexerparser getNextToken() token tabela de símbolos type checker Árvore sintática ou outra representação intermediária de código
4
Sintaxe de uma linguagem Define as strings estruturalmente válidas de uma linguagem “Fez parsing corretamente” = A sintaxe está correta Note: O programa pode ainda... não passar na checagem de tipos ou (de forma mais geral) conter erros
5
Especificação da sintaxe Dever ser precisa e fácil de entender Precisa: não ambígua Fácil de entender: deixa evidente a sintaxe da linguagem Historicamente, gramáticas livre de contexto (BNFs) é um formalismo adequado Fácil de especificar/manter/entender S aABe A Abc | b B d Exemplo:
6
Exercício. Qual das strings a seguir faz parte da liguagem definida pela BNF abaixo? abcba acca aba abcbcba S → aXa X → € | bY Y → € | cXc
7
Derivação e parsing S aABe A Abc | b B d Gramática G S aABe aAbcBe aAbcbcBe abbcbcBe abbcbcde Derivação de string em G S ABae Abc Abc d b Árvore sintática para abbcbcde
8
Diferenças: Derivação e parsing Derivação: Dada uma gramática G, produz uma string s que faz parte de L(G) Parsing: Dada uma string s em L(G), produz uma árvore sintática que demonstra como se obter derivação de s
9
Exercício. Qual das seguintes derivações é válida de acordo com a gramática ao lado? S aXa aa S aXa abYa acXca acca S → aXa X → € | bY Y → € | cXc | d S aXa abYa abcXcda abccda S aXa abYa abcXca abcbYcaabc bdca
10
Top-down e Bottom-up Considerando a ordem de criação da árvore sintática, top-down constrói o nó raiz primeiro e depois os internos em direção aos nós folha. bottom-up faz o contrário.
11
Top-down parser Procura sequência de derivações mais a esquerda para se obter uma string de entrada O parse da string abbcbcde é caracterizado pela sequência de derivações abaixo. S aABe A Abc | b B d S aABe aAbcBe aAbcbcBe abbcbcBe abbcbcde
12
Top-down parser Procura sequência de derivações mais a esquerda para se obter uma string de entrada O parse da string abbcbcde é caracterizado pela sequência de derivações abaixo. S aABe A Abc | b B d S aABe aAbcBe aAbcbcBe abbcbcBe abbcbcde Note a preferência da produção mais à esquerda
13
O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S aABe A Abc | b B d abbcbcd eS
14
O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S aABe A Abc | b B d abbcbcd eaABe
15
O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S aABe A Abc | b B d abbcbcd eABe escolha!
16
O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S aABe A Abc | b B d abbcbcd ebBebBe
17
O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S aABe A Abc | b B d abbcbcd eBeBe erro. Backtrack!
18
O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S aABe A Abc | b B d abbcbcd eABe Restaura estado anterior a última escolha Faz outra escolha!
19
O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S aABe A Abc | b B d abbcbcd eAbcBe
20
O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S aABe A Abc | b B d abbcbcd eAbcBe escolha novamente! Símbolo A novamente na posição mais à esquerda
21
O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S aABe A Abc | b B d abbcbcd ebbcBe Outra escolha!
22
O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S aABe A Abc | b B d abbcbcd ebcBe
23
O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S aABe A Abc | b B d abbcbcd eBeBe erro. Backtrack!
24
O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S aABe A Abc | b B d abbcbcd eAbcBe Restaura estado anterior a última escolha
25
O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S aABe A Abc | b B d abbcbcd eAbcbcBe Faz outra escolha!
26
O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S aABe A Abc | b B d abbcbcd ebbcbcBe
27
O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S aABe A Abc | b B d abbcbcd eBeBe
28
O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S aABe A Abc | b B d abbcbcd ede
29
O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S aABe A Abc | b B d abbcbcd e
30
O método Inicie com símbolo raiz Consuma tokens da esquerda para direita Decida que produção aplicar S aABe A Abc | b B d abbcbcd e derivação correspondente! S aABe aAbcBe aAbcbcBe abbcbcBe abbcbcde
31
Top-down parsers operam desta forma!
32
Exercício. Construa a árvore sintática associada a derivação (mais à esquerda) abaixo S aABe A Abc | b B d abbcbcd e S aABe aAbcBe aAbcbcBe abbcbcBe abbcbcde GramáticaString de entrada Derivação mais à esquerda
33
Classificação de parsers LL(k) Lê entrada da esquerda (L) para direita Procura derivação mais à esquerda Número de tokens de lookahead lidos porém não consumidos
34
Ambiguidade e Recursão à esquerda Ambiguidade: Existe mais de uma forma de se derivar a string em uma gramática ambígua Mais de uma parse tree Recursão à esquerda: dificuldade em saber quando parar de aplicar uma produção S aABe A Abc | b B d aABe aAbcBe aAbcbcBe aAbcbcbcBe aAbcbcbcbcBe … complicador
35
Ex: Quais das seguintes gramáticas são ambíguas? S → SS | a | b E → E + E | id S → Sa | Sb | a E → E’ | E’ + E E’ → -E’ | id | (E)
36
Predictive parsing É um parser top-down É um parser que não requer backtracking Simples de construir manualmente Mas, requer modificação na gramática para tratar recursão à esquerda e ambigüidade Eliminação de recursão à esquerda (fatoração): S aABe A Abc | b B d S aABe A bK K bcK | ∈ B d
37
Ex: Escolha a gramática que elimina recursão à esquerda corretamente da seguinte gramática: E → id + E | E + T | T T → id | (E) E → E’ + T | T E’ → id | (E) T → id | (E) E → E + T | T T → id | (E) E → TE’ E’ → +TE’ | € T → id | (E) E → E + id | E + (E) | id | (E)
38
Pode-se construir parser LL(k=1) para uma gramática não ambígua. Gramáticas ambíguas pedem parsers com valor de k > 1. Existem algoritmos para gerar parsers top-down de gramáticas ambíguas (e também com recursão à esquerda). Resultados gerais
39
Bottom-up parser Procura sequência de derivações mais a direita para se obter uma string de entrada O parse da string abbcbcde é caracterizado pela sequência de derivações abaixo. S aABe A Abc | b B d http://www.cs.wm.edu/~noonan/animations/rderive.html Animação S aABe aAde aAbcde aAbcbcde abbcbcde
40
O método Encontre padrões que casam com lado direito da produção e substitua pelo lado esquerdo S aABe A Abc | b B d abbcbcd e
41
O método Encontre padrões que casam com lado direito da produção e substitua pelo lado esquerdo S aABe A Abc | b B d abbcbcd e A
42
O método Encontre padrões que casam com lado direito da produção e substitua pelo lado esquerdo S aABe A Abc | b B d abbcbcd e A
43
O método Encontre padrões que casam com lado direito da produção e substitua pelo lado esquerdo S aABe A Abc | b B d abbcbcd e AB
44
O método Encontre padrões que casam com lado direito da produção e substitua pelo lado esquerdo S aABe A Abc | b B d abbcbcd e S S aABe aAde aAbcde aAbcbcde abbcbcde derivação correspondente!
45
Shift-reduce parsers Usa uma pilha e uma tabela Pilha: armazena tokens para salvar contexto Tabela: determina as opções atuais de ação Possíveis ações Shift (push): coloca tokens na pilha Reduce: determina uma produção Accept: finaliza. reconhece string. Error: Nenhuma ação é possível
46
LR(k) Lê entrada da esquerda (L) para direita Procura a derivação mais à direita Número de tokens de lookahead lidos porém não consumidos Bottom-up parsers operam desta forma! Terminologia: classificação de parsers
47
Comparação Top-down e Bottom-up Em geral, bottom-up é mais poderoso Coloca menos restrições na gramática Bem mais trabalhoso de se escrever e manter manualmente. Porém... Yacc e Bison geram parser de gramática LALR(1), um subconjunto LR(1)
48
Resumo desta aula Revisão de conceitos gerais de parsing Método de parsing top down e bottom up
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.