universidade federal da paraíba departamento de informática construção de compiladores análise...

35
Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Upload: internet

Post on 17-Apr-2015

128 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Construção de Compiladores

Análise Sintática

Page 2: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Análise Sintática

• Tem a função de combinar a lista de tokens Criação de uma estrutura chamada Árvore Sintática

• A analise sintática também deve rejeitar tokens inválidos Reportar erros sintáticos

atribuição

identificador

identificador

expressão

expressãoexpressão

número

:=

35SOMA SOMA

+

Page 3: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Análise Sintática

• A análise sintática é mais complexa em natureza do que a análise léxicaPrecisamos de uma linguagem mais avançada

• Hierarquia de Chomsky

Page 4: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Análise Sintática

• Tente representar as seguintes linguagens com uma gramática regularL1 = {anbn | n 0 }

L2 = {anbman | n 0, m 1}

Relembrando as regras da gramática regularA wB

A w

A

Page 5: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Análise Sintática

• Exemplo mais concretoExpressões aritméticas

Num[[+|-|x|/]num]*

Como representar casamento de parênteses? Não é possível contar o número de parênteses “não

casados” ou abertos

Como estabelecer precedências? O string é tratado como uma expressão plana, não tendo

estrutura

Modifique de forma a suportar “(“ e “)”

Page 6: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Análise Sintática

• Linguagens Livre de Contexto “Constituem um conjunto de linguagens que podem

ser geradas por gramáticas livre de contextos (GLC), reconhecidas por autômatos de pilha”

Page 7: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Análise Sintática

• Autômato de PilhaÉ uma 7-tupla < , Q, , , q0, I, F>, onde:

, alfabeto de símbolos de entrada Q, conjunto finito de estados possíveis do autômato , alfabeto da pilha , função de transição : Q x ( {}) x Q x * q0, estado inicial tal que q0 Q

I, símbolo inicial da pilha F, conjunto de estados finais, tais que F Q

Page 8: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Análise Sintática

• Autômato de Pilha (exemplo)Seja A = < , Q, , , q0, I, F>

Σ = {a, b} Q = {0, 1, 2}Γ = {X, A} q0 = 0I=X F = {2}

A função δ:{0,1,2}×{a,b,ε}×{X,A} → P({0,1,2}×{X,A}*) é dada porδ(0, a, X) → {(0, AX)}δ(1, b, A) → {(1, ε)}δ(0, a, A) → {(0, AA)}δ(1, ε, X) → {(2, X)}δ(0, b, A) → {(1, ε)}

Desempilhou A

Não fez nada

Empilhou ADesempilhou A

Empilhou A

Page 9: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Análise Sintática

• Autômato de Pilha (exemplo)Detalhes da notação:

Símbolo ε no resultado da função indica um pop– δ(1, b, A) = {(1, ε)}

Nas operações de push, sempre é representado o antigo topo da pilha no resultado

– δ(0, a, X) = {(0, AX)}

Operações de push podem empilhar mais do que um elemento

– δ(0, a, X) = {(0, XXAX)}

XA

X

A

XA

X

Antigo topo da pilha

X XA

X

X

Page 10: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Análise Sintática

• Gramáticas livre de contexto Quádrupla G = (N, T, P, S), onde:

N, conjunto finito de símbolos não-terminais T, conjunto finito de símbolos terminais P, conjunto finito de regras gramaticais na forma S, símbolo inicial da gramática pertencente a N

Regras gramaticais (P) na forma: N (N T)*

Page 11: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Análise Sintática

• Gramáticas livre de contexto (exemplos)A linguagem L1 = {anbn | n 0 } é gerada por qual

gramática?

A linguagem L2 = {anbman | n 0, m 1} é gerada por qual gramática?

Page 12: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Análise Sintática

• E o balanceamento de parênteses e a precedência de operadores?

Exp Exp + Exp

Exp Exp - Exp

Exp Exp * Exp

Exp Exp / Exp

Exp numero

Exp (Exp)

Gramática para expressões aritméticas simples

Page 13: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Análise Sintática

• Outro exemplo em programação

Stat Id := Exp

Stat Stat;Stat

Stat if Exp then Stat else Stat

Stat if Exp then Stat

Gramática para statements

Page 14: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• A maioria dos construtores das LP´s são expressos em GLCLinguagens são projetadas a partir de GLC

• É comum dividir os construtores em categorias sintáticas que englobam algum conceito particularExpressões: usada no cálculo de valoresStatements: ações que ocorrem em um fluxoDeclarações: propriedades dos nomes usados em

outras partes do programa

Page 15: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• Cada categoria sintática é denotada por um não terminal principalExpSifSwhSat ...

• Categorias sintáticas podem se referir a não terminais de outras categorias Podem também ser recursivas

Page 16: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• DerivaçõesMétodo de reescrever as regras gramaticais através de

substituição dos seus símbolos não-terminaisAs substituições devem ser feitas até que apenas

restes símbolos terminaisA seqüência de terminais restante deve ser definida

pela linguagem

Page 17: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• Definição formal para derivaçãoA relação de derivação “” é definida via três regras

N , se existe uma regra N , se existe um tal que e

Note que , e (T N)*

Page 18: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• Definição baseada em derivação para uma linguagem gerada por uma GLCDado uma GLC G com símbolo inicial S, símbolos

terminais T e produções P, a linguagem L(G) que G gera é definida para ser o conjunto de todas as strings de símbolos terminais que podem ser obtidas por derivação a partir de S usando as produções P, ou seja, o conjunto {w T* | S w}

Page 19: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• ExemploDado a gramática G, verifique se o string aabbbcc

pertence a L(G) T R T aTc R R RbR

Reposta?

T

Page 20: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• Diferentes derivações para a mesma questão

Qual a diferença?Derivação mais a esquerda X Derivação mais a direita

Page 21: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• Árvore SintáticaPode ser representada como uma árvore

A raiz é o símbolo inicial Resultados da produção dos símbolos não terminais são

filhos As folhas devem conter apenas símbolos terminais Lendo as folhas da esquerda para a direita temos a palavra

derivada Produções que levam ao vazio também devem ser

representadas, apesar de serem ignoradas na formação da palavra

Page 22: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

-Árvores sintática para a palavra aabbbcc

• Dada uma gramática G, a escolha da produção a ser derivada influencia na forma da árvore sintática T R T aTc R R RbR

Page 23: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• Quando uma gramática permite diferentes árvores sintáticas ela é dita ambígua

• Quando usamos gramáticas para impor estrutura sobre um conjunto de tokens, tal estrutura tem que ser sempre a mesma

Page 24: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• Exemplo de problemaProduções

E E + E | E * E | Numero

Como gerar a sentença 3 + 4 * 5

E E + E Numero + E 3 + E 3 + E * E 3 + Numero * E 3 + 4 * E 3 + 4 * Numero 3 + 4 * 5

E E * E E + E * E Numero + E * E 3 + E * E 3 + Numero * E 3 + 4 * E 3 + 4 * Numero 3 + 4 * 5

Page 25: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• Exemplo de problema

E E + E Numero + E 3 + E 3 + E * E 3 + Numero * E 3 + 4 * E 3 + 4 * Numero 3 + 4 * 5

E E * E E + E * E Numero + E * E 3 + E * E 3 + Numero * E 3 + 4 * E 3 + 4 * Numero 3 + 4 * 5

3523

Page 26: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• Em muitos (mas não todos) os casos, uma gramática ambígua pode ser reescrita em uma gramática não-ambíguaOutra opção é o uso de semântica externa para

decidir pela árvore correta

Page 27: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• Precedência de operadoresExplicitar precedência nas gramáticas

2 + 3 * 5

Como tirar essa ambigüidade?

Page 28: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• Alguns conceitos iniciais Operador pode ser associativo a esquerda Operador pode ser associativo a direita Operador pode ser não associativo

• Convenção - e / são obrigatoriamente associativos a esquerda + e * são opcionalmente associativos a esquerda Exemplo de operador associado a direita

a=b=c {atribuição em C} a=(b=c)

Exemplo de operador não associativo 2 < 3 < 4 {comparação em Pascal} Não permitido

Page 29: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• Reescrevendo expressões gramaticais ambíguasConsidere a seguinte gramática ambígua:

Como torná-la não ambigua? Se é associativo a esquerda, devemos forçar a gramática a

ser recursiva a esquerda

E E E E num

E E E’

E E’

E’ numÚnica árvore que pode se gerada

Page 30: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• Reescrevendo expressões gramaticais ambíguasE se for associativa a direita?

Forçar a gramática a ser recursiva a direita

E se for não associativa? Sem regras recursivas

E E’ E

E E’

E’ num

E E’ E’

E E’

E’ num

Page 31: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• Reescrevendo expressões gramaticais ambíguasExpandindo a idéia...

Operadores com a mesma precedência

E E + E’

E E - E’

E E’

E’ num

Page 32: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• Reescrevendo expressões gramaticais ambíguasExpandindo a idéia...

Operadores com diferentes precedências

Exp Exp + Exp2

Exp Exp - Exp2

Exp Exp2

Exp2 Exp2 * Exp3

Exp2 Exp2 / Exp3

Exp2 Exp3

Exp3 num

Exp3 (Exp)

Page 33: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• Outras fontes de ambigüidadeExemplo clássico do “else” em comandos de decisão

A convenção é casar o “else” com o “if” mais perto que ainda não tenha sido casado

Como representar isso na gramática?

If p then if q then s1 else s2

Page 34: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• If-the-else podem ser tratados como operadores associativos a direita

• Quando um “if” e um “else” casam, todas as ocorrências entre eles devem estar casadas

• Precisamos de dois símbolos não-terminais Matched: condicionais com o “else” Unmatched: condicionais sem o “else”

Page 35: Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Análise Sintática

Universidade Federal da ParaíbaDepartamento de Informática

Analise Sintática

• Gramática não ambígua para comandos

Stat Stat2 ; Stat

Stat Stat2

Stat2 Matched

Stat2 Unmatched

Matched if Exp then Matched else Matched

Matched id := Exp

Unmatched if Exp then Matched else Unmatched

Unmatched if Exp then Stat2