Analise Sintetica

19

Click here to load reader

description

NUMEROS ROMANOS

Transcript of Analise Sintetica

Page 1: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 1/19

1 INTRODUÇÃO

Cada linguagem de programação possui as regras que descrevem a estrutura sintática

dos programas bem formados. Em Pascal por exemplo, um programa é constituído por 

blocos, um bloco por comandos, um comando por expresses , uma expressão por 

to!ens e assim por diante. " sintaxe das construçes de uma linguagem de

programação pode ser descrita pelas gramáticas livres de contexto ou pela notação

#$% &%orma de #a!cus ' $aur(. "s gramáticas oferecem vantagens significativas

tanto para os pro)etistas de linguagens quanto para os escritores de compiladores.

• *ma gramática oferece, para uma linguagem de programação, uma

especificação sintática precisa e fácil de entender.

• Para certas classes de gramáticas, podemos construir automaticamente um

analisador sintático que determine se um programa+fonte está sintaticamente

bem+formado. Como benefício adicional, o processo de construção do

analisador pode revelar ambigidades sintáticas bem como outras construçes

difíceis de se analisar gramaticalmente, as quais poderiam, de outra forma,

seguir indetectadas na fase de pro)eto inicial de uma linguagem e de seu

compilador.

*ma gramática propriamente pro)etada implica uma estrutura de linguagem deprogramação -til tradução correta de programas+fonte em c/digos ob)eto e

também detecção de erros. Existem ferramentas disponíveis para a

conversão de descriçes de traduçes, baseadas em gramáticas, em

programas operativos.

•  "s linguagens evoluíram ao longo de um certo período de tempo, adquirindo

novas construçes e reali0ando tarefas adicionais. Essas novas construçes

podem ser mais facilmente incluídas quando existe uma implementação

baseada numa descrição gramatical da linguagem.

2 O PAPEL DO ANALISADOR SINTÁTICO

Existem tr1s tipos gerais de analisadores sintáticos. 2s métodos universais de análise

sintática, tais como o algoritmo de Coc!e+3ounger+4asami e o de Earle3, podem tratar 

qualquer gramática. Esses métodos, entretanto, saio muito ineficientes parta se usar 

num compilador de produção. 2s métodos mais comumente usados nos compiladores

são classificados como top+do5n ou bottom+up. Como indicado por seus nomes, os

analisadores sintáticos top+do5n, constroem árvores do topo &rai0( para o fundo

2

Page 2: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 2/19

&fol6as(, enquanto que os bottom+up começam pelas fol6as e trabal6am árvore acima

até a rai0. Em ambos os casos, a entrada é varrida da esquerda para a direita, um

símbolo de cada ve0.

2s métodos de análise sintática mais eficientes, tanto top+do5n quanto bottom+up,

trabal6am somente em determinadas subclasses de gramáticas, mas várias dessas

subclasses, como as das gramáticas 77 e 78, são suficientemente expressivas para

descrever a maioria das construçes sintáticas das linguagens de programação. 2s

analisadores implementados manualmente trabal6am freqentemente com gramáticas

779 por exemplo. "ssumimos que a saída de um analisador sintático se)a alguma

representação da árvore gramatical para o fluxo de to!ens produ0ido pelo analisador 

léxico. $a prática, existe um certo n-mero de tarefas que poderiam ser condu0idas

durante a análise sintática, tais como coletar informaçes sobre os vários to!ens na

tabela de símbolos, reali0ar a verificação de tipos e outras formas de análise

sem:ntica, assim como gerar o c/digo intermediário.

3 TRATAMENTO DE ERROS DE SINTAXE

;e um compilador tivesse que processar somente programas corretos, seu pro)eto e

sua implementação seriam grandemente simplificados. <as os programadores

freqentemente escrevem programas incorretos, e um bom compilador deveria assistir 

o programador na identificação e locali0ação de erros. = gritando que, apesar dos

erros serem lugar+comum, poucas linguagens se)am pro)etadas tendo+se o tratamento

de erros em mente. $ossa civili0ação seria radicalmente diferente se as linguagens

faladas tivessem as mesmas exig1ncias de correção sintática que as das linguagens

de computadores. " maioria das especificaçes das linguagens de programação não

descreve como um compilador deveria responder aos erros9 tal tarefa é deixada para o

pro)etista desde o início poderia ser tanto simplificar a estrutura de um compilador 

quanto mel6orar sua resposta aos erros.

;abemos que os programas podem conter erros em muitos níveis diferentes. Por 

exemplo, os erros podem ser>

• léxicos, tais como errar a grafia de um identificador, palavra+c6ave ou operador 

• sintáticos, tais como uma expressão aritmética com par1nteses não

balanceados• sem:nticos, tais como um operador aplicado a um operando incompatível

3

Page 3: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 3/19

• l/gicos, tais como uma c6amada infinitamente recursiva

%reqentemente, boa parte da detecção e recuperação de erros num compilador gira

em torno da fase de análise sintática. ?sto porque os erros ou são sintáticos por 

nature0a ou são expostos quando o fluxo de to!ens proveniente do analisador léxico

desobedece s regras gramaticais que definem a linguagem de programação. 2utra

ra0ão está na precisão dos modernos métodos de análise sintática9 podem detectar 

muito eficientemente a presença de erros sintáticos num programa. @etectar 

precisamente a presença de erros sem:nticos ou l/gicos em tempo de compilação é

muito mais difícil.

*m tratador de erros num analisador sintático possui metas simples de serem

estabelecidas>

• @eve relatar a presença de erros clara e acuradamente.

• @eve se recuperar de cada erro suficientemente rápido a fim de ser capa0 de

detectar erros subseqentes.

• $ão deve retardar significativamente o processamento de programas corretos.

 " reali0ação efetiva dessas metas apresenta desafios difíceis.

%eli0mente, os erros comuns são simples e freqentemente basta um mecanismo de

tratamento de erros relativamente direto. Em alguns casos, entretanto, um erro pode

ter ocorrido muito antes de sua presença ter sido detectada e sua nature0a precisa

pode ser muito difícil de ser dedu0ida. Em casos difíceis, o tratador de erros pode ter 

que advin6ar o que o programador tin6a em mente quando o programa foi escrito.

Aários métodos de análise sintática, tais como os métodos 77 e 78, detectam os erros

tão cedo quanto possível. <ais precisamente, possuem a propriedade do prefixo

viável, significando que detectam que um erro ocorreu tão logo ten6am examinado um

prefixo da entrada que não se)a o de qualquer cadeia da linguagem.

Como deveria um tratador de erros reportar a presença de um erroB $o mínimo,

deveria informar o local no programa fonte onde o mesmo foi detectado, uma ve0 que

existe uma boa c6ance de o erro efetivo ter ocorrido uns poucos to!ens antes. *ma

estratégia comum empregada por muitos compiladores é a de imprimir a lin6a ilegal

com um apontador para a posição na qual o erro foi detectado. ;e existir um ra0oável

4

Page 4: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 4/19

progn/stico de que o erro realmente foi, uma compreensível mensagem de

diagn/stico informativa é também incluída9 por exemplo, ponto+e+vírgula ausente

nesta posiçãoD.

*ma ve0 que o erro ten6a sido detectado, como deveria o analisador sintático se

recuperarB Existe um n-mero de estratégias gerais, mas nen6um método claramente

se impe sobre os demais. $a maioria dos casos, não é adequado para o analisador 

sintático encerrar logo ap/s detectar o primeiro erro, porque o processamento da

entrada restante ainda pode revelar outros. *sualmente, existe alguma forma de

recuperação de erros na qual o analisador tenta restaurar a si mesmo para um estado

onde o processamento da entrada possa continuar com uma ra0oável esperança de

que o resto correto da entrada será analisado e tratado adequadamente pelo

compilador.

*m trabal6o inadequado de recuperação pode introdu0ir uma avalanc6a de erros

esp-riosD, que não foram cometidos pelo programador, mas introdu0idos pelas

modificaçes no estado do analisador sintático durante a recuperação de erros. $uma

forma similar, uma recuperação de erros sintáticos pode introdu0ir erros sem:nticos

esp-rios que serão detectados posteriormente pelas fases de análise semt:ntica e de

geração de c/digo. Por exemplo, ao se recuperar de um erro, o analisador pode pular 

a declaração de alguma variável, digamos 0ap. uando 0ap for posteriormente

encontrada nas expresses, não 6averá nada sintaticamente errado, mas como não

6á uma entrada na tabela de símbolos para 0ap, a mensagem 0ap não definidoD será

gerada.

*ma estratégia cautelosa para o compilador é a de inibir as mensagens de erro que

proven6am de erros descobertos muito proximamente no fluxo de entrada. Em alguns

casos, pode 6aver erros demais para o compilador continuar um processamento

sensível &por exemplo, como deveria um compilador Pascal responder ao receber um

programa %ortran como entradaB(. Parece que uma estratégia de recuperação de

erros tem que ser um compromisso cuidadosamente considerado levando em conta os

tipos de erros que são mais propensos a ocorrer e ra0oáveis de processar.

 "lguns compiladores tentam reparar os erros, num processo em que tentam adivin6ar 

o que o programador queria escrever. 2 compilador P7FC &Con5a3 e Gilcox HIJKLM( é

um exemplo desse tipo. Exceto, possivelmente, num ambiente de pequenos

programas escritos por estudantes principiantes, a reparação extensiva de erros não épropensa a pagar o seu custo. @e fato, com a 1nfase crescente na computação

5

Page 5: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 5/19

interativa e bons ambientes de programação, a tend1ncia parece estar na direção de

mecanismos simples de recuperação de erros.

4 ANÁLISE SINTÁTICA TOP-DOWN

 " análise sintática top+do5n pode ser vista como uma tentativa de ser encontrar uma

derivação mais esquerda para uma cadeia de entrada. Equivalentemente, pode ser 

vista como uma tentativa de se construir uma árvore gramatical, para a cadeia de

entrada, a partir da rai0, criando os n/s da árvore gramatical em pré ordem.

Consideramos agora uma forma geral de análise sintática top+do5n, c6amada de

descend1ncia recursiva, que pode envolver retrocesso, ou se)a, a reali0ação de

esquadrin6amentos repetidos da entrada. Por outro lado, os analisadores sintáticos

com retrocesso não são vistos muito freqentemente. *ma ra0ão está em que o

retrocesso é raramente necessitado para analisar sintaticamente construçes de

linguagens de programação. Em situaçes tais como a análise sintática de linguagens

naturais, o retrocesso ainda é ineficiente e métodos tabulares, tais como o algoritmo

de programação din:mica ou método de Earle3 HIJKNM são preferidos.

2 retrocesso é exigido no pr/ximo exemplo, e iremos sugerir uma forma de controlar a

entrada quando o mesmo ocorrer.

Exemplo> Consideremos a gramática

; c"d

 " ab O a

E a cadeia de entrada 5cad. Para construir uma árvore gramatical para esta cadeia,de cima para baixo, criamos inicialmente uma árvore constituindo de um -nico n/

rotulado ;. 2 apontador da entrada aponta para c, o primeiro símbolo de 5. Em

seguida, usamos a primeira produção para ; a fim de expandir a árvore e obter a da

figura &a(.

6

S

 c dA

(a)

S

 c dA

a b

(b)

S

 c dA

a

(c)

Page 6: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 6/19

 " fol6a mais esquerda, rotulada c, recon6ece o primeiro símbolo de 5 e, por 

conseguinte, avançamos o apontador da entrada para a, o segundo símbolo de 5, e

consideramos a pr/xima fil6a, rotulada ". Em seguida, expandimos " usando a sua

primeira alternativa, obtendo a árvore da figura &b(. Qemos agora um recon6ecimento

para o segundo símbolo da entrada e, conseqentemente, avançamos para o

apontador da entrada para d, o terceiro símbolo da entrada, e comparamos d com a

pr/xima fol6a, rotulada b. Como b não é igual a d, reportamos uma fal6a e retornamos

a " a fim de verificar se existe uma outra alternativa que não ten6amos tentado ainda,

mas que poderia produ0ir um recon6ecimento.

 "o irmos de volta para ", precisamos restabelecer o apontador da entrada para a

posição R, aquela que o mesmo detin6a quando passamos pela primeira ve0 por ", o

que significa que o procedimento para " precisa arma0enar o apontador da entrada

numa variável local. Qentamos agora a segunda alternativa de " afim de obter a árvore

na figura &c(. " fol6a a recon6ece o segundo símbolo de 5 e a fol6a d o terceiro. *ma

ve0 que produ0imos uma árvore gramatical para 5, paramos e anunciamos o término

com sucesso da análise sintática.

*ma gramática recursiva esquerda pode levar um analisador sintático de

descend1ncia recursiva, mesmo com retrocesso, a um laço infinito. ?sto é, quando

tentamos expandir ", podemos eventualmente nos encontrar de novo tentando

expandir " sem ter consumido nen6um símbolo da entrada.

5 ANALISADORES SINTÁTICOS PREDITIVOS

Em muitos casos, escrevendo+se cuidadosamente uma gramática, eliminando+se a

recursão a esquerda e fatorando+se esquerda a gramática resultante, podemos obter 

uma nova gramática processável por um analisador sintático de descend1ncia

recursiva que não necessite de retrocesso, isto é, um analisador preditivo. Para

construir um analisador sintático preditivo, precisamos con6ecer, dado o símbolo

corrente de entrada a e o não terminal " a ser expandido, qual das alternativas deprodução " SI O SR O... O Sn é a -nica que deriva uma cadeia começando por a. 2u

7

Page 7: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 7/19

se)a, a alternativa adequada precisa ser detectável examinando+se apenas para o

primeiro símbolo da cadeia que a mesma deriva. "s construçes de controle de fluxo

na maioria das linguagens de programação, com suas palavras+c6ave distintivas, são

usualmente detectáveis dessa forma. Por exemplo, se tivermos as produçes>

cmd   if  expr then cmd else cmd 

O while expr do cmd 

O begin  lista_de_comandos end 

então as palavras+c6ave if , whi! e "!#i$ nos informam qual alternativa é a -nica que

possivelmente teria sucesso, se quiséssemos encontrar um comando.

5%1 Di&#'&(&) *! T'&$)i+,!) &'& A$&i)&*.'!) Si$/0/i.) P'!*i/i.)

 "s várias diferenças entre os diagramas de transiçes para um analisador léxico e um

analisador sintático preditivo são imediatamente aparentes. $o caso de um analisador 

sintático, existe um diagrama para cada não terminal. 2s r/tulos dos lados são to!ens

e não terminais. *ma transição em um to!en &terminal( significa que devemos reali0á+

la se aquele to!en for o pr/ximo símbolo da entrada. *ma transição num não+terminal

 " é c6amada de procedimento para ".

Para construir um diagrama de transiçes de um analisador sintático preditivo a partir 

de uma gramática, eliminamos primeiro da gramática a recursividade esquerda e,

em seguida, a fatoramos esquerda. Para cada não+terminal ", então fa0emos o

seguinte>

I. Criamos um estado inicial e um final &de retorno(.R. R. Para cada produção " TI,TR...Tn, criamos um percurso a partir do estado

inicial até o estado final, com os lados rotulados TI,TR,...,Tn.

2 analisador preditivo ao trabal6ar sobre os diagramas de transiçes se comporta

como segue. Começa no estado inicial para o símbolo de partida. ;e ap/s algumas

açes estiver no estado s, o qual possui um lado rotulado pelo terminal a apontado

para o estado t, e se o pr/ximo símbolo de entrada for a, move o cursor de entrada

uma posição direita e vai para o estado t. ;e, de outra feita, o lado for rotulado pelonão terminal ", vai para o estado de partida ", sem movimentar o cursor de entrada.

8

Page 8: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 8/19

;e em algum instante for atingido o estado final de ", vai imediatamente para o estado

t, tendo como efeito, lidoD " a partir da entrada, durante o tempo em que se movia do

estado s para t. %inalmente, se existir um lado de s para t rotulado U, vai, a partir do

estado s, imediatamente para o estado t, sem avançar na entrada.

*m programa de análise sintática preditiva baseado num diagrama de transiçes tenta

recon6ecer símbolos terminais na entrada e fa0 uma c6amada de procedimento

potencialmente recursiva sempre que precisar seguir um lado rotulado por um não

terminal. *ma implementação não recursiva pode ser obtida empil6ando+se o estado s

quando existir uma transição em um não terminal para fora de s e removendo+se o

topo da pil6a quando o estado final para o não terminal for atingido.

 " abordagem acima funcionará se o diagrama de transiçes dado for determinístico,

isto é, não existir mais de uma transição de um mesmo para outros mesma entrada.

;e a ambigidade ocorrer, deveremos estar capacitados a resolv1+la de uma forma

ad+6oc. ;e o não determinismo não puder ser eliminado, não poderemos construir um

analisador sintático preditivo, mas poderemos construir um analisador de

descend1ncia recursiva com retrocesso, de forma a tentar sistematicamente todas as

possibilidades, se esta fosse a mel6or estratégia de análise que pudéssemos

encontrar.

5%2 A$0i)! Si$/0/i& P'!*i/i& N.-R!')i&

= possível construir um analisador preditivo não+recursivo mantendo explicitamente

uma pil6a, ao invés de implicitamente através de c6amadas recursivas. 2 problema+

c6ave durante a análise preditiva é determinar que produção deve ser aplicada a um

dado não terminal.

*m analisador sintático preditivo dirigido por uma tabela possui um buffer de entrada,

uma pil6a, uma tabela sintática e um fluxo de saída. 2 buffer de entrada possui a

cadeia a ser analisada, seguida por um V direita para indicar o fim da cadeia de

entrada. " pil6a contém uma seq1ncia de símbolos gramaticais, com V indicando o

fundo da pil6a. ?nicialmente, a pil6a contém o símbolo de partida da gramática acima

de V. *ma tabela sintática é um arra3 bidimensional <H",aM, onde " é um não terminal

e a é um terminal ou outro símbolo V.

9

Page 9: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 9/19

2 analisador sintático é controlado por um programa que se comporta como segue. 2

programa considera T o símbolo ao topo da pil6a e a o símbolo corrente de entrada.

Esses dois símbolos determinam a ação do analisador. Existem tr1s possibilidades>

I. ;e T"V, o analisador pára e anuncia o término com sucesso da análise

sintática.

R. ;e TaWV, o analisador sintático remove T da pil6a e avança o apontador da

entrada para o pr/ximo símbolo.

3. ;e T é um não terminal, o programa consulta a entrada <HT,aM da tabela

sintática <. Essa entrada será uma produção ' T da gramática ou uma entrada

de erro. ;e, por exemplo, <HT,aMXT  *AGY, o analisador substitui T no topo

da pil6a por GA* &com * ao topo(. Como saída, iremos assumir que o

analisador sintático simplesmente imprima a produção usada9 de fato, qualquer 

outro c/digo poderia ser executado aqui. ;e <HT,aMerro, o analisador c6ama

uma rotina de recuperação de erros.

2 comportamento do analisador sintático pode ser descrito em termos de suas

configuraçes, que dão o conte-do da pil6a e a entrada restante.

5%2%1 P'i(!i'. ! S!#i$/!

 " construção de um analisador sintático preditivo é auxiliada por duas funçes

associadas gramática Z. Essas funçes, Primeiro e ;eguinte, nos permitem

preenc6er as entradas de uma tabela sintática preditiva para Z, sempre que possível.

2s con)untos de to!ens produ0idos pela função seguinte podem também ser usados

como to!ens de sincroni0ação durante a recuperação de erros na modalidade do

desespero.

;e S for qualquer cadeia de símbolos gramaticais, se)a primeiro&S( o con)unto de

terminais que começam as cadeias derivadas a partir de S. @efinamos seguinte&"(,

para o não terminal ", como sendo um con)unto de terminais a que podem figurar 

imediatamente direita de " em alguma forma sentencial, isto é, o con)unto de

terminais a tais que exista uma derivação para algum S e [. ;e " puder ser o símbolo

mais direita em alguma forma sentencial, então V está em ;EZ*?$QE&"(.

5%3 R!!'&+. *! E''.) $& &$0i)! P'!*i/i&

10

Page 10: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 10/19

 " pil6a de um analisador preditivo não recursivo torna explícitos os terminais e não

terminais que o mesmo espera recon6ecer com o restante da entrada. ?remos

conseqentemente nos referir aos símbolos na pil6a do analisador da discussão que

se segue. *m erro é detectado durante a análise preditiva quando o terminal ao topo

da pil6a não recon6ece o pr/ximo símbolo de entrada ou quando o não terminal " está

ao topo da pil6a, a é o pr/ximo símbolo de entrada e a entrada da tabela sintática

<H",aM está va0ia.

 " recuperação de erros na modalidade do desespero está baseada na idéia de se

pular símbolos na entrada até que sur)a um to!en pertencente a um con)unto pré

selecionado de to!ens de sincroni0ação. ;ua efetividade depende da escol6a do

con)unto de sincroni0ação. 2s con)untos deveriam ser escol6idos de tal forma que o

analisador se recuperasse rapidamente dos erros que tendessem a ocorrer na prática.

 "lgumas técnicas 6eurísticas são>

I. Como ponto de partida, podemos colocar todos os símbolos de ;EZ*?$QE&"(

no con)unto de to!ens de sincroni0ação para o não terminal ". ;e pularmos

to!ens até que um elemento de ;EZ*?$QE&"( se)a visto e removermos " da

pil6a, é provável que a análise sintática possa continuar.

R. $ão é suficiente usar ;EZ*?$QE&"( como o con)unto de sincroni0ação para ".

Por exemplo, se os pontos+e+vírgulas terminarem os enunciados, como em C,

então as palavras+c6ave que iniciam os enunciados não devem aparecer no

con)unto ;EZ*?$QE do não+terminal que gera expresses. *m ponto+e+vírgula

ausente ap/s uma atribuição pode conseqentemente resultar na omissão da

palavra c6ave que inicia o pr/ximo enunciado. %reqentemente, existe uma

estrutura 6ierárquica nas construçes da linguagem9 por exemplo, as

expresses aparecem dentro de enunciados, que figuram dentro de blocos e

assim por diante. Podemos adicionar ao con)unto de sincroni0ação de uma

construção mais baixa os símbolos que começam as construçes mais altas.

Por exemplo, poderíamos adicionar palavras+c6ave que iniciam comandos aos

con)untos de sincroni0ação para os não+terminais que geram expresses.

L. ;e adicionarmos os símbolos em P8?<E?82&"( ao con)unto de sincroni0ação

para o não terminal ", pode ser possível retornar a análise a partir de ", se um

símbolo em P8?<E?82&"( figurar na entrada.

\. ;e um não terminal puder gerar a cadeia va0ia, então a produção que deriva Upode ser usada como default. "gindo+se assim, pode+se postergar a detecção

de algum erro, mas não se pode fa0er com que um erro se)a perdido. Esse

11

Page 11: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 11/19

enfoque redu0 o n-mero de não terminais que ten6am de ser considerados

durante a recuperação de erros.

]. ;e um terminal ao topo da pil6a não puder ser recon6ecido, uma idéia simples

é a de remov1+lo, emitir uma mensagem informando da remoção e prosseguir 

a análise sintática. Com efeito, este enfoque fa0 com que o con)unto de

sincroni0ação de um to!en consista em todos os demais to!ens.

ANÁLISE SINTÁTICA 6OTTOM-UP

 " análise sintática bottom+up é con6ecida como análise de empil6ar e redu0ir. "

análise gramatical de empil6ar e redu0ir tenta construir uma árvore gramatical para

uma cadeia de entrada começando pelas fol6as &o fundo( e trabal6ando árvore acima

em direção rai0 &o topo(. Podemos pensar neste processo como o de redu0irD uma

cadeia 5 ao símbolo de partida de uma gramática. " cada passo de redução, uma

subcadeia particular, que recon6eça o lado direito de uma produção, é substituída pelo

símbolo esquerda daquela produção e, se a subcadeia tiver sido escol6ida

corretamente a cada passo, uma derivação mais direita terá sido rastreada na ordem

inversa.

Exemplo>

Considerando a gramática

;a"#e

 " "bc O b

# d

 " sentença abbcde pode ser redu0ida a ; pelos seguintes passos>

 "abbcde

a"bcde

a"de

a"#e

;

Podemos esquadrin6ar abbcde procurando por uma subcadeia que recon6eça o lado

direito de alguma produção. "s subcadeias b e d se qualificam. Aamos escol6er o bmais esquerda e substituí+lo por ", o lado esquerdo da produção "b9 obtemos

12

Page 12: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 12/19

dessa forma a cadeia a"bcde. "gora as subcadeias "bc, b e d recon6ecem o lado

direito de alguma produção. "pesar de b ser a subcadeia mais esquerda que

recon6eça o lado direito de alguma produção, escol6emos substituir a subcadeia "bc

por ", o lado esquerdo da produção " "bc. 2btemos agora a"de. Com a substituição

de d por #, o lado esquerdo da produção #d, obtemos a"#e. Podemos agora

substituir toda esta cadeia por ;. Conseqentemente, através de uma seq1ncia de

quatro reduçes, estamos capacitados a redu0ir abbcde a ;. Essas reduçes, de fato,

rastreiam a seguinte derivação mais direita, na ordem reversa>

; a"#e a"de a"bcde abbcde

7 8ANDLES

?nformalmente, um 6andle é uma subcadeia que recon6ece o lado direito de uma

produção e cu)a redução ao não terminal do lado esquerdo da produção representa

um passo ao longo do percurso de uma derivação mais direita. Em muitos casos, a

subcadeia [ mais esquerda que recon6ece o lado direito de uma produção " [

não é um 6andle, porque uma redução pela produção " [ produ0 uma cadeia que

não pode ser redu0ida ao símbolo de partida.

7%1 A P.*& *. 8&$*!

*ma derivação mais esquerda na ordem inversa pode ser obtida podando+se os

6andlesD. 2u se)a, começamos pela primeira cadeia de terminais 5 que dese)amos

decompor. ;e 5 for uma sentença da gramática em questão, então 53n, onde 3n é a

enésima forma sentencial direita de alguma derivação mais direita ainda

descon6ecida.

Para reconstruir esta derivação na ordem inversa, locali0amos o 6andle [n  em 3n  e

substituímos [n pelo lado direito de alguma produção "n  [n de modo a obtermos a

enésima menos uma forma sentencial direita 3n+I.

8epetimos, em seguida, esse processo. ?sto é, locali0amos o 6andle ^n+I em 3n+I e o

redu0imos de forma a obter a forma sentencial direita 3n+R. Continuando esse

processo, produ0imos uma forma sentencial direita consistindo somente no símbolo

de partida ; e então paramos e anunciamos o término com sucesso da análise

13

Page 13: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 13/19

sintática. 2 reverso da seq1ncia de produçes usadas nas reduçes é uma derivação

mais direita para a cadeia de entrada.

9 IMPLEMENTAÇÃO DE PIL8A DA ANÁLISE SINTÁTICA

DE EMPIL8AR E REDU:IR

Existem dois problemas que precisam ser resolvidos se estivermos dispostos a

analisar sintaticamente através da poda de 6andles. 2 primeiro é o de locali0ar a

subcadeia a ser redu0ida numa forma sentencial direita e o segundo é o de

determinar que produção escol6er no caso de existir mais de uma produção com

aquela subcadeia no lado direito.

*ma forma conveniente de implementar um analisador sintático de empil6ar e redu0ir 

é usar uma pil6a para guardar os símbolos gramaticais e um buffer de entrada para a

cadeia 5 a ser decomposta. *samos V para marcar o fundo da pil6a e também o final

direita da entrada. ?nicialmente, a pil6a está va0ia e a cadeia 5 está entrada como

segue

Pil6a Entrada

V 5V

2 analisador sintático opera empil6ando 0ero ou mais símbolos &na pil6a( até que um

6andle [ sur)a no topo da pil6a. 8edu0, então, [ para o lado esquerdo da produção

apropriada. 8epete este ciclo até que ten6a detectado um erro ou que a pil6a

conten6a o símbolo de partida e a entrada este)a va0ia>

Pil6a Entrada

V; V

 "p/s entrar nesta configuração, pára e anuncia o término com sucesso da análise

sintática.

9%1 P'!fi;.) Vi0!i)

2s prefixos de uma forma sentencial direita que podem figurar na pil6a deu m

analisador sintático de empil6ar e redu0ir são c6amados de prefixos viáveis. *madefinição equivalente de um prefixo viável é a de ser um prefixo de uma forma

sentencial direita, o qual não se estende para além do limite direita do 6andle mais

14

Page 14: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 14/19

direita, daquela forma sentencial. Por esta definição é sempre possível adicionar 

símbolos terminais ao final de um prefixo viável de modo a obter uma forma sentencial

direita. Por conseguinte, não 6á aparentemente erro na medida em que a porção da

entrada enxergada até um dado ponto possa ser redu0ida a um prefixo viável.

< ANÁLISE SINTÁTICA DE PRECED=NCIA DE OPERADORES

 " mais ampla classe de gramáticas, para a qual os analisadores sintáticos de empil6ar 

e redu0ir podem ser construídos com sucesso são as gramáticas 78. Entretanto, para

uma pequena, porém importante classe de gramáticas, podemos facilmente construir 

manualmente eficientes analisadores sintáticos de empil6ar e redu0ir. Essas

gramáticas possuem a propriedade &dentre outras exig1ncias essenciais( de que

nen6um lado direito de produção se)a U, ou ten6a dois não terminais ad)acentes. *ma

gramática com a -ltima propriedade é c6amada de uma gramática de operadores.

Exemplo>

 " seguinte gramática para expresses

E E"E O &E( O +E Oid

 " _ O + O ` O F O

$ão é uma gramática de operadores porque o lado direito E"E possui dois &de fato

tr1s( não terminais consecutivos. Entretanto, se substituirmos " por cada uma de suas

alternativas, obtemos a seguinte gramática de operadores>

E E _ E O E 'E O E ` EO E F E O E E O &E( O +E O id

@escrevemos agora uma técnica de análise sintática fácil de implementar c6amada de

análise sintática de preced1ncia de operadores. istoricamente, esta técnica foi

primeiramente descrita como uma manipulação sobre to!ens sem qualquer refer1ncia

a uma gramática sub)acente. @e fato, uma ve0 que ten6amos terminado de construir 

um analisador sintático de preced1ncia de operadores a partir de uma gramática,

15

Page 15: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 15/19

podemos ignorar esta -ltima usando os não terminais na pil6a apenas como

marcadores de lugar para os atributos associados aos não terminais.

Como uma técnica geral de análise sintática, a de preced1ncia de operadores possui

uma série de desvantagens. Por exemplo, é difícil tratar os to!ens como o sinal de

menos, que possui duas diferentes preced1ncias &dependendo de ser unário ou

binário(. ;obretudo, uma ve0 que o relacionamento entre a gramática para a

linguagem analisada e o analisador sintático de preced1ncia de operadores é t1nue,

não se pode estar sempre certo de que o analisador aceite exatamente a linguagem

dese)ada. %inalmente, somente uma pequena classe de gramáticas pode ser 

decomposta usando as técnicas de preced1ncia de operadores.

 "pesar de tudo, em virtude de sua simplicidade, numerosos compiladores usando as

técnicas de análise sintática de preced1ncia de operadores t1m sido construídos com

sucesso. %reqentemente, esses analisadores são de descend1ncia recursiva.

 "nalisadores sintáticos de preced1ncia de operadores tem sido construídos até

mesmo para linguagens inteiras.

1> ANALISADORES SINTÁTICOS LR

*ma técnica eficiente de análise sintática bottom+up, que pode ser usada para

decompor uma ampla classe de gramáticas livres de contexto é c6amada análise

sintática 78&!(9 oD7D significa varredura da entrada da esquerda para a direita &left+to+

rig6t(, o 8D, construir uma derivação mais direita ao contrário &rig6t(most derivation(

e o !, o n-mero de símbolos de entrada de loo!a6ead que são usados ao se tomar 

decises na análise sintática. uando &!( for omitido, ! é assumido ser I. " técnica de

análise sintática 78 é atrativa por uma série de ra0es.

•  "nalisadores sintáticos 78 podem ser elaborados para recon6ecer virtualmente

todas as construçes de linguagens de programação para as quais as

gramáticas livres de contexto podem ser escritas.

• 2 método de decomposição 78 é o mais geral dentre os métodos sem

retrocesso de empil6ar e redu0ir con6ecidos e ainda pode ser implementado

tão eficientemente quanto os demais métodos de empil6ar e redu0ir, .

•  " classe de gramáticas que podem ser decompostas usando+se os métodos

78 é um supercon)unto pr/prio da classe de gramáticas que podem ser decompostas usando+se analisadores sintáticos preditivos.

16

Page 16: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 16/19

• *m analisador sintático 78 pode detectar um erro sintático tão cedo quanto

possível numa varredura da entrada da esquerda para a direita.

 " principal desvantagem deste método está em ser muito trabal6oso construir um

analisador sintático 78 manualmente para uma gramática típica de linguagem de

programação. $ecessita+se em geral de uma ferramenta especiali0ada ' um gerador 

de analisadores 78. %eli0mente, muitos de tais geradores estão disponíveis. Com um

tal gerador, podemos escrever uma gramática livre de contexto e usá+lo para produ0ir 

automaticamente um analisador sintático para a mesma. ;e a gramática contiver 

ambigidades ou outras construçes que se)am difíceis de decompor, numa varredura

da entrada da esquerda para a direita, o gerador de analisadores pode locali0á+las e

informar ao pro)etista do compilador de suas ocorr1ncias.

1>%1 O A#.'i/(. *! A$0i)! Si$/0/i& LR

Consiste em uma entrada, uma saída, uma pil6a, um programa diretor e uma tabela

sintática que possui duas partes &ação e desvio(. 2 programa diretor é o mesmo para

todos os tr1s tipos de analisadores 789 somente a tabela sintática muda de um

analisador para o outro. 2 programa de análise sintática l1 os caracteres provenientes

de um buffer de entrada, um de cada ve0. *sa uma pil6a para arma0enar as cadeias

sob a forma sNTIsITRsR...Tmsm onde sm está ao topo. Cada Ti é um símbolo gramatical

e cada si, um símbolo c6amado de estado. Cada estado sumari0a a informação

contida na pil6a abaixo do mesmo e a combinação do símbolo do estado no topo da

pil6a e o símbolo corrente de entrada é usada para indexar a tabela sintática e

determinar a decisão de empil6ar ou redu0ir durante a análise. $uma implementação,

os símbolos gramaticais não precisam figurar na pil6a9 entretanto, iremos sempre

incluí+los em nossas discusses, a fim de auxiliar a explicação do comportamento de

uma analisador sintático 78.

 " tabela sintática consiste em duas partes, uma unção de açes sintáticas, ação, e

uma função de desvio, desvio. 2 programa diretor do analisador 78 se comporta como

se segue. @etermina sm, o estado correntemente no topo da pil6a, e a i, o símbolo

corrente de entrada. Consulta, então açãoHsm,aiM, a entrada da tabela de açes

sintáticas para o estada sm e a entrada ai, que pode ter um dos seguintes valores>

I. empil6ar s, onde s é um estado,R. redu0ir através da produção gramatical " [,

17

Page 17: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 17/19

L. aceitar, e

\. erro.

 " função desvio toma um estado e um símbolo gramatical como argumentos e produ0

um estado como saída. Aeremos que a função desvio de uma tabela sintática,

construída a partir de uma gramática Z, usando os métodos ;78, 78 cannico ou

7"78, é a função de transição de um autmato finito determinístico que recon6ece os

prefixos viáveis de Z. 8elembremos que os prefixos viáveis de Z são aqueles das

formas sentenciais direita que podem aparecer na pil6a de um analisador sintático

de empil6ar e redu0ir, porque os mesmos não se estendem para depois do 6andle

mais direita. 2 estado inicial deste "%@ é o estado inicialmente colocado no topo da

pil6a do analisador sintático 78.

*ma configuração de um analisador sintático 78 é um par cu)o primeiro componente é

o conte-do da pil6a e cu)o segundo componente é a entrada ainda não consumida>

&sNTI;IxR;R...Tmsm,aiai_I...anV(

Esta configuração representa a forma sentencial direita

TITR...Tmaiai_I...an

Essencialmente da mesma maneira que um analisador de empil6ar e redu0ir faria>

somente a presença dos estados na pil6a é inovadora.

2 pr/prio movimento do analisador é determinado pela leitura de a i, o símbolo

corrente da entrada e de sm, o estado no topo d pil6a, e pela consulta entrada da

tabela de açes, açãoHsm,a  iM. "s configuraçes resultantes ap/s cada um dos quatro

tipos de movimentos são como se segue>

I. ;e ação Hsm,a  iMempil6ar s, o analisador executa um movimento e empil6ar,

entrando na configuração

&sNTIsIT RsR...Tmsm,ais,ai_I...anV(

 "qui, o analisador sintático empil6ou tanto o símbolo corrente de entrada como opr/ximo estado s, que é dado por açãoHsm,a  iM9 ai_I se torna o símbolo corrente da

entrada.

18

Page 18: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 18/19

R. ;e açãoHsm,a iMredu0ir " [, o analisador executa um movimento de redução,

entrando na configuração

&sNTIsIT RsR...Tm+r sm+r ,"s,ai ai_I...anV(

onde sdesvioHsm+r ,"M e r é o comprimento de [, o lado direito da produção. "qui o

analisador sintático remove primeiro Rr símbolos para fora da pil6a &r símbolos de

estados e r símbolos gramaticais(, expondo o estado sm+r . Em seguida, empil6a tanto

 ", o lado esquerdo da produção, quanto s, a entrada para desvioHsm+r ,"M. Para os

analisadores sintáticos 78 que iremos construir, Tm+r_I... Tm, a seq1ncia de símbolos

gramaticais removidos da pil6a irá sempre recon6ecer [, o lado direito da produção

redutora.

 " saída de um analisador sintático 78 é gerada ap/s um movimento de redução,

através da execução de uma ação sem:ntica associada produção redutora. Para o

momento, assumiremos que a saída consista somente na impressão da produção

redutora.

L. ;e açãoHsm,a iMaceitar, a análise sintática está completa.

\. ;e açãoHsm,a  iMerro, o analisador sintático descobriu um erro e c6ama um

procedimento de recuperação de erros.

19

Page 19: Analise Sintetica

7/21/2019 Analise Sintetica

http://slidepdf.com/reader/full/analise-sintetica-56d9d39fbd5d7 19/19

RE?ER=NCIAS 6I6LIO@RÁ?ICAS

Aho, Alfred V; Sethi, Ravi; Ullman, Jerey D - Compiladores - Princpios, !"cnicas e

#erramentas - $ditora %!C &''(

20