Analise Sintetica
Click here to load reader
-
Upload
leandrofer -
Category
Documents
-
view
213 -
download
0
description
Transcript of 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
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
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
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
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)
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
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
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
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
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
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
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
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
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
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
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
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
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
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