A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Construção de Compiladores

Apresentações semelhantes


Apresentação em tema: "Construção de Compiladores"— Transcrição da apresentação:

1 Construção de Compiladores
Análise Sintática

2 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 expressão número := 35 SOMA +

3 Análise Sintática A análise sintática é mais complexa em natureza do que a análise léxica Precisamos de uma linguagem mais avançada Hierarquia de Chomsky

4 Análise Sintática Tente representar as seguintes linguagens com uma gramática regular L1 = {anbn | n  0 } L2 = {anbman | n  0, m  1} Relembrando as regras da gramática regular A  wB A  w A  

5 Análise Sintática Exemplo mais concreto Expressõ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 “)”

6 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”

7 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

8 Análise Sintática Autômato de Pilha (exemplo)
Seja A = < , Q, , , q0, I, F> Σ = {a, b} Q = {0, 1, 2} Γ = {X, A} q0 = 0 I=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, ε)} Empilhou A Desempilhou A Empilhou A Não fez nada Desempilhou A

9 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)} A X X A A X X Antigo topo da pilha X X A X X

10 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)*

11 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?

12 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

13 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

14 Analise Sintática A maioria dos construtores das LP´s são expressos em GLC Linguagens são projetadas a partir de GLC É comum dividir os construtores em categorias sintáticas que englobam algum conceito particular Expressões: usada no cálculo de valores Statements: ações que ocorrem em um fluxo Declarações: propriedades dos nomes usados em outras partes do programa

15 Analise Sintática Cada categoria sintática é denotada por um não terminal principal Exp Sif Swh Sat ... Categorias sintáticas podem se referir a não terminais de outras categorias Podem também ser recursivas

16 Analise Sintática Derivações
Método de reescrever as regras gramaticais através de substituição dos seus símbolos não-terminais As substituições devem ser feitas até que apenas restes símbolos terminais A seqüência de terminais restante deve ser definida pela linguagem

17 Analise Sintática Definição formal para derivação
A 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)*

18 Analise Sintática Definição baseada em derivação para uma linguagem gerada por uma GLC Dado 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}

19 Analise Sintática Exemplo
Dado a gramática G, verifique se o string aabbbcc pertence a L(G) T  R T  aTc R   R  RbR Reposta? T 

20 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

21 Analise Sintática Árvore Sintática
Pode 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

22 Analise Sintática 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 Árvores sintática para a palavra aabbbcc

23 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

24 Analise Sintática Exemplo de problema Produções Como gerar a sentença
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  * E  * Numero  * 5 E  E * E  E + E * E  Numero + E * E  3 + E * E  3 + Numero * E  * E  * Numero  * 5

25 Analise Sintática Exemplo de problema
E  E + E  Numero + E  3 + E  3 + E * E  3 + Numero * E  * E  * Numero  * 5 E  E * E  E + E * E  Numero + E * E  3 + E * E  3 + Numero * E  * E  * Numero  * 5 35 23

26 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ígua Outra opção é o uso de semântica externa para decidir pela árvore correta

27 Analise Sintática Precedência de operadores
Explicitar precedência nas gramáticas 2 + 3 * 5 Como tirar essa ambigüidade?

28 Analise Sintática Alguns conceitos iniciais Convenção
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

29 Analise Sintática Reescrevendo expressões gramaticais ambíguas
Considere 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

30 Analise Sintática Reescrevendo expressões gramaticais ambíguas
E 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

31 Analise Sintática Reescrevendo expressões gramaticais ambíguas
Expandindo a idéia... Operadores com a mesma precedência E  E + E’ E  E - E’ E  E’ E’  num

32 Analise Sintática Reescrevendo expressões gramaticais ambíguas
Expandindo 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)

33 Analise Sintática Outras fontes de ambigüidade
Exemplo 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

34 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”

35 Analise Sintática Gramática não ambígua para comandos
Stat  Stat2 ; Stat Stat  Stat2 Stat  Matched Stat  Unmatched Matched  if Exp then Matched else Matched Matched  id := Exp Unmatched  if Exp then Matched else Unmatched Unmatched  if Exp then Stat2


Carregar ppt "Construção de Compiladores"

Apresentações semelhantes


Anúncios Google