Академический Документы
Профессиональный Документы
Культура Документы
a partir do ponto A na ADS de uma sentena, podemos derivar pela regra (1) ou (2) para se chegar mesma cadeia.
Pg. 2
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
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),
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.
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
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.
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
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
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