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

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

Análise Sintática Recursiva e Preditiva

Apresentações semelhantes


Apresentação em tema: "Análise Sintática Recursiva e Preditiva"— Transcrição da apresentação:

1 Análise Sintática Recursiva e Preditiva
Compiladores Prof. Diomara Martins Reigato Barros FEMA - IMESA 15/09/2018

2 Objetivo Demonstrar a Análise Sintática Top Down e os dois métodos existentes: Análise Sintática Recursiva e Análise Sintática Preditiva LL(1), bem como a construção da tabela LL(1) e as ações do analisador sintático.

3 Tópicos Revisão sobre as fases da compilação Análise Sintática
Analisador Sintático Top Down Análise Descendente Recursiva Análise Sintática Preditiva LL(1) Tabela Sintática Preditiva Ações do Analisador Sintático Preditivo Conclusão

4 O Compilador Programa Fonte (linguagem fonte) Compilador (compiler)
Alvo (linguagem alvo) Mensagens de erro

5 Fases da Compilação

6 Análise Sintática É a segunda fase de um compilador.
É responsável pela leitura do fluxo de tokens produzido pelo analisador léxico checando se tal fluxo pode ser gerado pela gramática da linguagem-fonte. Também é chamada de análise gramatical ou parsing. Verifica os elementos estruturais do programa Os resultados dessa Análise são demonstrados na forma de Árvores Sintáticas.

7 O Analisador Sintático:
– algoritmo que recebendo como entrada uma sentença x, emite como saída: ● Árvore Sintática de x, se x pertence à linguagem ● erro Sintático, caso x não pertença à linguagem. 7

8 Posicionamento da Anal. Sintática
Representação Intermediária Programa Fonte Obter Token Analisador Léxico Analisador Síntático Resto da interface de vanguarda Token Árvore Gramatical Tabela de Símbolos

9 Dois métodos de algoritmos:
Análise Sintática Top Down (Descendente) constroem árvores do Topo para as Folhas Análise Sintática Botton Up (Ascendente) começam pelas folhas até a raiz - Nos dois métodos a entrada é varrida da esquerda para a direita, um símbolo de cada vez

10 Derivações podem variar, até mesmo quando a árvore sintatica não existe:
Derivação mais a esquerda (Slide 9 era mais direita): (1) exp  exp op exp [exp  exp op exp] (2)  (exp) op exp [exp  ( exp )] (3)  (exp op exp) op exp [exp  exp op exp] (4)  (number op exp) op exp [exp  number] (5)  (number - exp) op exp [op  -] (6)  (number - number) op exp [exp  number] (7)  (number - number) * exp [op  *] (8)  (number - number) * number [exp  number]

11 Tipos de Analisadores Sintáticos
1 6 2 7 4 3 5 1 2 3 5 6 7 8 9 4 10 Estratégia de Construção Top-Down Estratégia de Construção Bottom-Up

12 Mas o que acontece se a árvore sintática variar?[ exp op exp op exp ]
correta A gramática é ambígua, por quê precisamos tomar cuidado? Semântica!

13 Notação Extra: Inicial: Backus-Naur Form (BNF) Extended BNF (EBNF):
Meta símbolos são |   Extended BNF (EBNF): Novos meta símbolos […] e {…}  em grande parte eliminado por estes

14 EBNF Meta símbolos: Colchetes […] significam “opcionais” (como ? Em expressões regulares) Chaves {…} significam “repetição” (como * em ER)

15 Chaves em EBNF Troca somente a repetição a esquerda:
exp  exp + term | term exp  term { + term } Exemplo: expexp soma termo | termo Soma  + | - Termo  termo mult fator | fator Mult  * Fator  (exp) | número

16 EBNF correspondente é:
exp termo {soma termo} Soma  + | - Termo  fator { mult fator} Mult  * Fator  (exp) | número

17 Necessidade de Conhecimentos:
Gramática Livre de Contexto (GLC) Expressões Regulares Simplificação de Gramática Eliminação de Recursão à Esquerda Conjuntos de Primeiro e sequência Árvores Gramaticais

18 Analisador Sintático Top Down
Analisadores com Retrocesso(Recursivos) testa diferentes possibilidades, retrocedendo se alguma falhar Analisadores Preditivos tenta prever a construção seguinte, com base em uma ou mais marcas à frente

19 Análise Sintática Top Down
Descendente Recursiva ● O processo é ineficiente, pois leva à repetição da leitura de partes da sentença de entrada ● Quando ocorre um erro, não é possível determinar o ponto exato onde este ocorreu, devido à tentativa de produções alternativas. ● Uma gramática recursiva à esquerda pode gerar um ciclo infinito de expansão de não-terminais, mesmo com retrocesso, pode levar a um laço infinito.

20 DESCENDENTES RECURSIVOS
Para Exemplo: considere a gramática: ● S  cAd ● A  ab | a Para a cadeia cad: S A d c a b (1) Expansão A com 1a. produção (2) Retrocesso devido erro S A d c a (0) Expansão de S S A d c a (3) Expansão A com 2a. produção

21 Como visto no exemplo anterior:
a construção da árvore gramatical começa de cima para baixo usando o símbolo de partida; a medida em que são encontrados os símbolos não-terminais são expandidos; da mesma forma são consumidos um a um os símbolos terminais encontrados; quando um símbolo terminal não tem correspondência com a produção em uso ocorre o retrocesso.

22 ANÁLISE PREDITIVA LL(1)
LL = varredura (Esquerda para Direita) Left-to-right das entradas e constrói uma derivação mais a (Leftmost) esquerda 1 = usa apenas 1 símbolo de entrada para prever a derivação da análise.

23 Estrutura de um An. Sintático Preditivo LL(1)

24 O termo Preditivo deve-se ao fato de que a pilha sempre contém a descrição do restante da sentença (se ela estiver correta); isto é, prevê a parte da sentença que deve estar na entrada para que a sentença esteja correta.

25 Tabela Sintática Preditiva
Em cada entrada da tabela M existe uma única produção viabilizando a análise determinística da sentença de entrada. Para isso é necessário que a gramática: – Não possuir recursão à esquerda; – Estar fatorada (ser determinística)

26 Exemplo de Gramática Recursiva à esquerda:
Para a gramática : E  E + T | T T  T * F | F F  (E) | id Eliminando a recursão à esquerda de E e T: E  TE’ E’  +TE’ |  T  FT’ T’  *FT’ |  F  (E) | id

27 Tabelas Sintáticas Preditivas
O funcionamento dos analisadores sintáticos preditivos não-recursivos depende de tabelas sintáticas preditivas. A construção de tais tabelas pode ser realizada através do uso de algoritmos conhecidos. Tal construção é facilitada através de algumas funções associadas a gramática a ser analisada: Conjuntos de PRIMEIRO e SEQUENCIA.

28 Conjuntos de Primeiro Seja X um símbolo gramatical (Não-terminal). O conjunto Primeiro de X é composto por terminais, e possivelmente (ε). Para isso separamos a gramática em regras e vamos definindo os conjuntos de primeiros, através de várias passadas pelas regras até que não haja mais alterações.

29 Exemplo de Gramática S (S)S| ε (1) S (S)S (2) S ε PRIM(S) = {( , ε}

30 Conjuntos de Sequencia
Dado um Não Terminal X, o conjunto de sequência(X) é composto por terminais e possivelmente $, é definido como segue: Se X for o símbolo inicial, então $ pertence a Sequencia(X). SEQ(X) = {$} Para X AB  , então: Seq(A)=PRIM(B) – {ε} (Se em PRIM(B) produz (ε), então também coloque SEQ(X) em SEQ(A))

31 Cont. Conjuntos de Sequencia
-Se no lugar de B fosse um Não terminal (,) por exemplo, então: X  A , SEQ(A) = {,} No caso do Não Terminal(B):  X AB -Quando à direita do não terminal não estiver mais nada, ou seja, ele é o último, então: SEQ(B) = SEQ(X)  = {$}

32 Exemplo da Gramática Anterior
S (S)S| ε (1) S (S)S (2) S ε PRIM(S) = {( , ε} SEQ(S) = {$ , )}

33 Tabela Análise Sintática Top-down
PRIM SEQ S a,d $ B c, ε D a, ε b Gramática G1 S  aB|d B  cDb| ε D  a| ε Gramática G2 S  aSa|A A  bB B  cBc|c PRIM SEQ S a,b a,$ A b B c a,c,$

34 Tabela Análise Sintática Top-down
Gramática G3 Z  XYZ|d Y  c| ε X  Y|a PRIM SEQ Z d,a,c, ε $ Y c, ε $,a,c,d X a,c, ε $,c PRIM SEQ E n,( $,) X +,-, ε S +,- T +,-,$,) Y *, ε M * F *,+,-,$,) Gramática G4 E  TX X  STX| ε S  +|- T  FY Y  MFY| ε M  * F  (E)|n Gramática G4 E  EST|T S  +|- T  TMF|F M  * F  (E)|n

35 Tabela Análise Sintática Top-down
Gramática G5 S (A)|b A  B:A|B B  a|  first follow S b,( $ A a,  ) B :,) Gramática G6 S (A)|b A  A;B|B B  a|  first follow S b,( $ A a, ) X ;,  B a,  ;,) -- fatoração --- S  (A)|b A  BX X  ;BX| B  a|

36 Construção de Tabelas Sintáticas Preditivas
A tabela é uma matriz M[N,T], composta pelos Não-terminais nas Linhas e terminais nas colunas + $ Montamos a tabela verificando os Conjuntos de Primeiro, para cada terminal dos conjuntos de Primeiro, adicionamos na tabela as regras referentes aos terminais. Se ε pertence ao conjunto de Primeiro, então essa produção para ε é inserida em todos os conjuntos de sequencia desse Não terminal.

37 Construção de Tabelas Sintáticas Preditivas
Prim Seq S ( , ε $ , ) S (S)S|ε M[N,T] ( ) $ S S (S)S S ε

38 Analisador Sint.Preditivo LL(1)
● tem como função determinar a partir de X (topo da pilha) e de a (o próximo símbolo) a ação a ser executada: ● Se X = a = $  o analisador anuncia o final da análise. ● Se X = a <> $  o analisador retira X do topo da pilha e a da entrada. (reconhecimento sintático de a, chamamos isso de casamento)

39 Analisador Sint.Preditivo LL(1)
Duas Ações do Analisador Top Down Preditivo: - substituir um não-terminal A do topo da pilha por uma cadeia, com base na escolha da regra gramatical, através da tabela sintática LL(1) - Casar uma marca no topo da pilha com uma marca de entrada seguinte, se os terminais forem iguais.

40 Analisador Sint.Preditivo LL(1)
A Análise Sintática Top Down é bem sucedida se Pilha = $ e Cadeia de entrada = $, caso contrário ERRO.

41 Ações do Analisador Sintático Preditivo para o reconhecimento de cadeias de entrada
Através da tabela LL(1) é possível definir as ações do analizador : 1 – Enumerar os passos 2 - A cadeia de entrada é finalizada por $. 3 - A pilha, também finalizada por $, é iniciada com o símbolo inicial da gramática. 4 – Efetuar as ações.

42 Ações do Analisador para a Cadeia ( )
Tabela Preditiva LL(1) M[N,T] ( ) $ S S (S)S S ε Ações:

43 Outro exemplo de construção de tabela
Definir as ações para a entrada (a:a)

44 Conclusão O analisador sintático agrupa os tokens fornecidos pelo analisador léxico em estruturas sintáticas, construindo a árvore sintática correspondente que é passada para a próxima fase. Para isso, utiliza uma série de regras de sintaxe, que constituem a gramática da linguagem fonte. É a gramática da linguagem que define a estrutura sintática do programa fonte. O analisador sintático tem também por tarefa o reconhecimento de erros sintáticos, que são construções do programa fonte que não estão de acordo com as regras de formação de estruturas sintáticas como especificado pela gramática.

45 Referência Bibliográfica
AHO, A.V.; SETHI, R.; ULLMAN, J.D., LAM, M.S. Compiladores: princípios, técnicas e ferramentas. 2.ed. São Paulo: Pearson Addison - Wesley, p.


Carregar ppt "Análise Sintática Recursiva e Preditiva"

Apresentações semelhantes


Anúncios Google