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
Analise Sintática II

2 Adaptando a Gramática Requerimento de Linguagem Recursiva
Na indisponibilidade de uma linguagem recursiva, podemos utilizar o analisador de gramáticas LL(k)) No LL(k) ("Left-to-right Left-mostderivation") basta olharmos no máximo k símbolos à frente na sentença para decidir que regra de produção aplicar

3 Método Top-down Analisador de Gramáticas LL(1)

4 Método Top-down LL(1) – Funcionamento
Sendo X o símbolo do topo da pilha, e PS o atual símbolo de entrada, as ações podem ser: Se X é um terminal = PS = $, o analisador encerra sua atividade e comunica fim da análise sintática com sucesso Se X é um terminal = PS ≠ $, o analisador elimina X do topo da pilha e avança para o próximo símbolo de entrada Se X é um terminal ≠ PS, o analisador acusa um erro de sintaxe (ativa rotina de tratamento de erros)

5 Método Top-down LL(1) – Funcionamento (continuação)
Se X é um não-terminal, o analisador consulta M[X, PS]. Se a resposta for uma regra de produção X ::= MVU, o analisador desempilha X do topo da pilha e empilha UVM (com M no topo da pilha). Para a saída é enviada a regra de produção usada Se M[X, PS] = ERRO, o analisador acusa um erro de sintaxe (ativa rotina de tratamento de erros)

6 Método Top-down LL(1) – Exemplo S ::= aAS S ::= b A ::= a A ::= bSA
w = abbab$

7 Construção da Tabela Considerando um não terminal A, três tipos de informação são importantes para a construção da tabela: Se A gera ou não cadeia vazia  Quais são os símbolos terminais iniciadores de A Se A * , que terminais podem aparecer como primeiro símbolo de  Quais são os símbolos terminais seguidores de A Se S * A, que terminais podem aparecer como primeiro símbolo de 

8 Cadeia Vazia  Algoritmo: identificação dos não-terminais que derivam  A lista L contém, inicialmente, todas as regras de G Retire de L as regras que possuem um terminal Se existe um não-terminal A sem regras, marcar A como NÃO Se existe um A  , retirar todas as regras que tem A do lado esquerdo, remover A do lado direito das regras restantes e marcar A como SIM Se uma regra tem do lado direito um não-terminal marcado NÃO, o símbolo esquerdo também é marcado como não e a regra removida (Repetir 3, 4 e 5 enquanto houver regras)

9 Cadeia Vazia  - exemplo
1. P  A B C D 2. A   3. A  a A 4. B   5. B  B b 6. C   7. C  A B 8. D  d Preencher L com todos as regras da gramática Gera  : Não gera  :

10 Cadeia Vazia  - exemplo
Retirar da lista L as regras que possuem terminais do lado direito D não tem regras, então é marcado com NÃO - A tem uma regra com lado direito  então é marcado SIM e remove a regra 2 - As ocorrências de A nas regras 1 e 7 são removidas - B tem uma regra com lado direito  então é marcado SIM e remove a regra 4 - As ocorrências de B nas regras 1 e 7 são removidas - C tem uma regra com lado direito  então é marcado SIM e remove a regra 6 e 7 - A ocorrência de C na regra 1 é removida e Como D está marcado não, P também é marcado não L: 1. P  A B C D 2. A   3. A  a A 4. B   5. B  B b 6. C   7. C  A B 8. D  d Gera  : Não gera  :

11 Cadeia Vazia  - exemplo
Preencher a lista L com as regras que não possuem terminais do lado direito D não tem regras, então é marcado com NÃO - A tem uma regra com lado direito  então é marcado SIM e remove a regra 2 - As ocorrências de A nas regras 1 e 7 são removidas - B tem uma regra com lado direito  então é marcado SIM e remove a regra 4 - As ocorrências de B nas regras 1 e 7 são removidas - C tem uma regra com lado direito  então é marcado SIM e remove a regra 6 e 7 - A ocorrência de C na regra 1 é removida e Como D está marcado não, P também é marcado não L: 1. P  A B C D 2. A   3. A  a A 4. B   5. B  B b 6. C   7. C  A B 8. D  d Gera  : Não gera  : D

12 Cadeia Vazia  - exemplo
Preencher a lista L com as regras que não possuem terminais do lado direito D não tem regras, então é marcado com NÃO - A tem uma regra com lado direito  então é marcado SIM e remove a regra 2 - As ocorrências de A nas regras 1 e 7 são removidas - B tem uma regra com lado direito  então é marcado SIM e remove a regra 4 - As ocorrências de B nas regras 1 e 7 são removidas - C tem uma regra com lado direito  então é marcado SIM e remove a regra 6 e 7 - A ocorrência de C na regra 1 é removida e Como D está marcado não, P também é marcado não L: 1. P  A B C D 2. A   3. A  a A 4. B   5. B  B b 6. C   7. C  A B 8. D  d Gera  : Não gera  : A D

13 Cadeia Vazia  - exemplo
Preencher a lista L com as regras que não possuem terminais do lado direito D não tem regras, então é marcado com NÃO - A tem uma regra com lado direito  então é marcado SIM e remove a regra 2 - As ocorrências de A nas regras 1 e 7 são removidas - B tem uma regra com lado direito  então é marcado SIM e remove a regra 4 - As ocorrências de B nas regras 1 e 7 são removidas - C tem uma regra com lado direito  então é marcado SIM e remove a regra 6 e 7 - A ocorrência de C na regra 1 é removida e Como D está marcado não, P também é marcado não L: 1. P  A B C D 2. A   3. A  a A 4. B   5. B  B b 6. C   7. C  A B 8. D  d Gera  : Não gera  : A D

14 Cadeia Vazia  - exemplo
Preencher a lista L com as regras que não possuem terminais do lado direito D não tem regras, então é marcado com NÃO - A tem uma regra com lado direito  então é marcado SIM e remove a regra 2 - As ocorrências de A nas regras 1 e 7 são removidas - B tem uma regra com lado direito  então é marcado SIM e remove a regra 4 - As ocorrências de B nas regras 1 e 7 são removidas - C tem uma regra com lado direito  então é marcado SIM e remove a regra 6 e 7 - A ocorrência de C na regra 1 é removida e Como D está marcado não, P também é marcado não L: 1. P  A B C D 2. A   3. A  a A 4. B   5. B  B b 6. C   7. C  A B 8. D  d Gera  : Não gera  : A B D

15 Cadeia Vazia  - exemplo
Preencher a lista L com as regras que não possuem terminais do lado direito D não tem regras, então é marcado com NÃO - A tem uma regra com lado direito  então é marcado SIM e remove a regra 2 - As ocorrências de A nas regras 1 e 7 são removidas - B tem uma regra com lado direito  então é marcado SIM e remove a regra 4 - As ocorrências de B nas regras 1 e 7 são removidas - C tem uma regra com lado direito  então é marcado SIM e remove a regra 6 e 7 - A ocorrência de C na regra 1 é removida e Como D está marcado não, P também é marcado não L: 1. P  A B C D 2. A   3. A  a A 4. B   5. B  B b 6. C   7. C  A B 8. D  d Gera  : Não gera  : A B D

16 Cadeia Vazia  - exemplo
Preencher a lista L com as regras que não possuem terminais do lado direito D não tem regras, então é marcado com NÃO - A tem uma regra com lado direito  então é marcado SIM e remove a regra 2 - As ocorrências de A nas regras 1 e 7 são removidas - B tem uma regra com lado direito  então é marcado SIM e remove a regra 4 - As ocorrências de B nas regras 1 e 7 são removidas - C tem uma regra com lado direito  então é marcado SIM e remove a regra 6 e 7 - A ocorrência de C na regra 1 é removida e Como D está marcado não, P também é marcado não L: 1. P  A B C D 2. A   3. A  a A 4. B   5. B  B b 6. C   7. C  A B 8. D  d Gera  : Não gera  : A B D

17 Cadeia Vazia  - exemplo
Preencher a lista L com as regras que não possuem terminais do lado direito D não tem regras, então é marcado com NÃO - A tem uma regra com lado direito  então é marcado SIM e remove a regra 2 - As ocorrências de A nas regras 1 e 7 são removidas - B tem uma regra com lado direito  então é marcado SIM e remove a regra 4 - As ocorrências de B nas regras 1 e 7 são removidas - C tem uma regra com lado direito  então é marcado SIM e remove a regra 6 e 7 - A ocorrência de C na regra 1 é removida e Como D está marcado não, P também é marcado não L: 1. P  A B C D 2. A   3. A  a A 4. B   5. B  B b 6. C   7. C  A B 8. D  d Gera  : Não gera  : A B C D

18 Cadeia Vazia  - exemplo
Preencher a lista L com as regras que não possuem terminais do lado direito D não tem regras, então é marcado com NÃO - A tem uma regra com lado direito  então é marcado SIM e remove a regra 2 - As ocorrências de A nas regras 1 e 7 são removidas - B tem uma regra com lado direito  então é marcado SIM e remove a regra 4 - As ocorrências de B nas regras 1 e 7 são removidas - C tem uma regra com lado direito  então é marcado SIM e remove a regra 6 e 7 - A ocorrência de C na regra 1 é removida e como D está marcado não, P também é marcado não e a regra removida L: 1. P  A B C D 2. A   3. A  a A 4. B   5. B  B b 6. C   7. C  A B 8. D  d Gera  : Não gera  : A B C D P

19 Conjunto Primeiro (First)
É o conjunto de símbolos terminais que iniciam uma sequência de símbolos, de acordo com as seguintes regras: Se =, Primeiro() = Primeiro() = {} Se  é um terminal a, Primeiro() = Primeiro(a) = {a} Se  é uma cadeia a, cujo primeiro símbolo é um terminal a, Primeiro() = Primeiro(a) = {a} Se  é um não-terminal A, Primeiro(A) é calculado via algoritmo Se  é uma cadeia A, e o primeiro símbolo é um não não-terminal A, que deriva , Primeiro() = Primeiro(A) = Primeiro(A)  Primeiro() Se  é uma cadeia A, e o primeiro símbolo é um não não-terminal A, que não deriva , Primeiro() = Primeiro(A) = Primeiro(A)

20 Conjunto Primeiro (First)
Algoritmo Inicialmente para todo não-terminal A da gramática, todos Primeiro (A) estão vazios Se um não terminal A gera , acrescentar  a Primeiro(A) Para cada regra A → B1...Bma, tal que para todo i=1,...,m; Bi →* , acrescentar “a” a Primeiro(A) Para cada regra A → B1...Bm, tal que para todo i=1,...,m; Bi →* , acrescentar Primeiro() a Primeiro(A) (Repetir 4 enquanto houver alteração no valor de algum Primeiro)

21 Conjunto Primeiro (First)
Exemplo E → E + T E → T T → T * F T → F F → ( E ) F → a Nenhum dos não-terminais produz  Primeiro(E) = Primeiro(T) = Primeiro(F) = { } Pela regra 5, adiciona-se “(“ a Primeiro(F) Pela regra 6, adiciona-se “a“ a Primeiro(F) Pela regra 4, adiciona-se Primeiro(F) a Primeiro(T) Pela regra 2, adiciona-se Primeiro(T) a Primeiro(E) Primeiro(E) : Primeiro(T) : Primeiro(F) : ( a ( a ( a

22 Conjunto Seguidor (Follow)
Seguidor(A) é o conjunto de símbolos terminais que seguem o não-terminal A Se o não-terminal aparece no fim da cadeia não há um seguidor, neste caso usamos o $ para indicar o final da cadeia (eof) $ sempre será seguidor de S (símbolo inicial da gramática)

23 Conjunto Seguidor (Follow)
Algoritmo Todos os não terminais A da gramática, inicialmente, terão Seguidor(A) = { }, exceto S que terá Seguidor(S) = {$} Se há uma regra A → Ba, e =B1...Bm →* , acrescentar “a” a Seguidor(B) Se há uma regra A → BC, e =B1...Bm →* , acrescentar Primeiro(C) a Seguidor(B) Se há uma regra A → B, e =B1...Bm →* , acrescentar Seguidor(A) a Seguidor(B) Repetir passo 4 sempre que houver modificações nos conjuntos

24 Conjunto Seguidor (Follow)
Exemplo E → E + T E → T T → T * F T → F F → ( E ) F → a Nenhum dos não-terminais produz  Inicialmente tem-se Seguidor(E) = {$} e demais vazios Pela regra 1, acrescentamos “+” a Seguidor(E) Pela regra 3, acrescentamos “*” a Seguidor(T) Pela regra 5, acrescentamos “)” a Seguidor(E) Pela regra 2, adiciona-se Seguidor(E) a Seguidor(T) Pela regra 4, adiciona-se Seguidor(T) a Seguidor(F) Primeiro(E) : Primeiro(T) : Primeiro(F) : ( a Seguidor(E) : Seguidor(T) : Seguidor(F) : $ + ) ( a * $ + ) ( a * $ + )

25 Se houver mais de uma produção para M[X,y] a gramática é ambígua
Construção da Tabela Algoritmo: considere uma matriz M[X,y], onde as linhas são os não-terminais e as colunas terminais Para cada produção A→  de G, executar os passos 2 e 3 (criação da linha A da tabela) Para cada terminal a de Primeiro(), adicionar a produção A →  a M[A,a] Se Primeiro() inclui , então adicione A→  a M[A,b] para cada b em Seguidor(A) Se houver mais de uma produção para M[X,y] a gramática é ambígua

26 Construção da Tabela a + * ( ) $ E T F Primeiro(E) : Primeiro(T) :
Regras E → E + T E → T T → T * F T → F F → ( E ) F → a Primeiro(E) : Primeiro(T) : Primeiro(F) : ( a Seguidor(E) : Seguidor(T) : Seguidor(F) : $ * + ) a + * ( ) $ E T F 1 2 1 2 3 4 3 4 Gera  : Não gera  : F T E 5 6

27 Construção da Tabela a + * ( ) $ E T F Primeiro(E) : Primeiro(T) :
Considere a existência desse símbolo vazio. Note que regras são acrescidas na tabela. Regras E → E + T E → T T → T * F T → F F → ( E ) F → a Primeiro(E) : Primeiro(T) : Primeiro(F) : ( a Seguidor(E) : Seguidor(T) : Seguidor(F) : $ * + ) a + * ( ) $ E T F 1 2 1 1 2 1 1 3 4 3 4 Gera  : Não gera  : F T E 5 6


Carregar ppt "Construção de Compiladores"

Apresentações semelhantes


Anúncios Google