Вы находитесь на странице: 1из 24

Compiladores

Anlise Sinttica - Aula 06 Noiza Waltrick Trindade [noiza@uems.br]

Descendente preditivo ou Analisador de Gramticas LL(K)


O analisador sinttico descendente recursivo tem algumas restries para sua implementao. Uma delas, j abordada, diz respeito ao uso de produes recursivas esquerda que levam o analisador um ciclo ("loop") infinito. Outra restrio diz respeito ocorrncias de produes do tipo:
(1) A ::= (2) A ::=

a partir do ponto A na ADS de uma sentena, podemos derivar pela regra (1) ou (2) para se chegar mesma cadeia.
Pg. 2

Descendente preditivo Como resolver esse problema?

Usando desdobramento da regra de produo:


(3) A ::= C
(4) C ::= |

Problema resolvido? Sim, podemos implementar o analisador sinttico recursivo para quaisquer gramticas que obedeam essas duas restries. E se no temos disponvel uma linguagem de programao recursiva p/ implementar o analisador?
Pg. 3

Descendente preditivo
Nesse caso podemos utilizar um analisador sinttico descendente preditor (ou analisador de gramticas LL(K)). A idia do analisador LL(K) ("Left-to-right Left-mostderivation K") de que basta olharmos no mximo K smbolos frente na sentena, a partir do ponto em que estamos na ADS, para que possamos decidir que regra de produo aplicar.

S ::= aS | bS | c
G(S) LL(1) w = abc

S ::= abS | acS | ad


G(S) LL(2) w = abad

w = bac
Pg. 4

w = acad

Descendente preditivo
Em termos de linguagens de programao, quase sempre possvel obter-se uma gramtica LL(1) que permita o reconhecimento sinttico de programas atravs de um analisador LL(1) que bastante simples de implementar. O analisador sinttico:
receber uma seqncia de entrada (a sentena a ser analisada),

manipular uma estrutura de dados tipo pilha (onde monta a ADS),


consultar uma tabela de anlise sinttica (tabela de "parsing") e

emitir uma seqncia de sada (regras que esto sendo aplicadas).

Pg. 5

Descendente preditivo

Pg. 6

Descendente preditivo
A seqncia de entrada formada pela sentena a ser analisada, seguida por um smbolo delimitador ($). A pilha contm uma seqncia de smbolos da gramtica, precedida pelo indicador de base de pilha ($).

A tabela de anlise sinttica uma matriz M[A,a] onde 'A' um no-terminal e 'a' um terminal ou dlar ($). A seqncia de sada constar das produes aplicadas a partir do smbolo inicial (S), na gerao da sentena.

Pg. 7

Descendente preditivo
Inicialmente a pilha contm o smbolo inicial da gramtica precedido por dlar ($). O analisador sinttico, a partir de X, smbolo do topo da pilha, e prximo_smbolo, o atual smbolo da entrada, determina sua ao que pode ser uma das quatro possibilidades a seguir:
1) Se X um terminal = prximo_smbolo = $, o analisador encerra sua atividade e comunica fim da anlise sinttica com sucesso;

2) Se X um terminal = prximo_smbolo $, o analisador elimina X do topo da pilha e avana para o prximo smbolo de entrada;

Pg. 8

Descendente preditivo
3) Se X um terminal prximo_smbolo, o analisador acusa um erro de sintaxe (chama rotina de tratamento de erros); 4) Se X um no-terminal, o analisador consulta M[X, prximo_smbolo].

Se a resposta for uma regra de produo X ::= MVU, o analisador desempilha X do topo da pilha e empilha UVM (com M no topo da pilha).
Para a sada enviada a regra de produo usada. Se M[X, prximo_smbolo] = ERRO, o analisador acusa um erro de sintaxe (chama rotina de tratamento de erro).

Pg. 9

Descendente preditivo Exemplo: Seja a gramtica G abaixo com a respectiva tabela de anlise sinttica.

(1) S ::= aAS


(2) S ::= b (3) A ::= a (4) A ::= bSA

Pg. 10

Descendente preditivo Dada a sentena w = abbab$, o analisador sinttico assumiria as seguintes configuraes durante a anlise:

Pg. 11

Descendente preditivo

Pg. 12

Descendente preditivo A idia e o algoritmo do preditor bastante simples.

Olhando com mais calma, porm, vemos que est faltando uma coisa fundamental.
Como obter a tabela (ou matriz) de anlise? Para chegarmos at ela, precisamos utilizar dois conceitos (ou relaes) em gramticas j estudados.

So os conceitos de FIRST ("First") e FOLLOW ("Follow").


Pg. 13

Descendente preditivo

Pg. 14

Descendente preditivo
Tabela de parsing

Pg. 15

Descendente preditivo
Construo da Tabela de parsing

Pg. 16

Descendente preditivo
Construo da Tabela de parsing

Pg. 17

Descendente preditivo
Construo da Tabela de parsing

Pg. 18

Descendente preditivo
Construo da Tabela de parsing

Pg. 19

Descendente preditivo O algoritmo dado vlido para qualquer gramtica

Porm, para algumas gramticas, a matriz M pode possuir algumas entradas multiplamente definidas
por exemplo, se a gramtica recursiva esquerda ou ambgua, temos pelo menos uma entrada multiplamente definida.

Pg. 20

Descendente preditivo Exemplo: A gramtica abaixo ambgua para a sentena w, e pode ser interpretada de duas formas diferentes. <cmd> ::= if <cond> then <cmd> <pelse> <cmd> ::= a

<pelse> ::= else <cmd> <pelse> ::= e <cond> ::= b


W = if <cond> then if <cond> then a else a
Pg. 21

Descendente preditivo W = if <cond> then if <cond> then a else a

if <cond> then if <cond> then a else a ou


if <cond> then if <cond> then a else a
Pg. 22

Descendente preditivo Para essa gramtica, teramos a seguinte matriz de anlise sinttica:

Pg. 23

Descendente preditivo Gramticas cujas tabelas de anlise sinttica no possuem entradas mltiplas definidas so ditas LL(1).

Pg. 24

Вам также может понравиться