Você está na página 1de 6

INTRODUO

Cada linguagem de programao possui as regras que descrevem a estrutura


sinttica dos programas bem formados. Em Pascal por exemplo, um programa
constitudo por blocos, um bloco por comandos, um comando por expresses, uma
expresso por to!ens e assim por diante. " sintaxe das construes de uma linguagem
de programao pode ser descrita pelas gramticas livres de contexto ou pela notao
#$% &%orma de #a!cus ' $aur(. "s gramticas oferecem vantagens significativas tanto
para os pro)etistas de linguagens quanto para os escritores de compiladores.
*ma gramtica oferece, para uma linguagem de programao, uma
especificao sinttica precisa e fcil de entender.
Para certas classes de gramticas, podemos construir automaticamente um
analisador sinttico que determine se um programa+fonte est sintaticamente
bem+formado. Como benefcio adicional, o processo de construo do analisador
pode revelar ambiguidades sintticas bem como outras construes difceis 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 gramtica propriamente pro)etada implica uma estrutura de linguagem de
programao ,til - traduo correta de programas+fonte em c.digos ob)eto e
tambm - deteco de erros. Existem ferramentas disponveis para a converso
de descries de tradues, baseadas em gramticas, em programas operativos.
"s linguagens evoluram ao longo de um certo perodo de
tempo, adquirindo novas construes e reali/ando tarefas adicionais. Essas
novas construes podem ser mais facilmente includas quando existe uma
implementao baseada numa descrio gramatical da linguagem.
O PAPEL DO ANALISADOR SINTTICO
Existem tr0s tipos gerais de analisadores sintticos. 1s mtodos universais de
anlise sinttica, tais como o algoritmo de Coc!e+2ounger+3asami e o de Earle2, podem
tratar qualquer gramtica. Esses mtodos, entretanto, saio muito ineficientes parta se
usar num compilador de produo. 1s mtodos mais comumente usados nos
compiladores so classificados como top+do4n ou bottom+up. Como indicado por seus
nomes, os analisadores sintticos top+do4n, constroem rvores do topo &rai/( para o
fundo &fol5as(, enquanto que os bottom+up comeam pelas fol5as e trabal5am rvore
acima at a rai/. Em ambos os casos, a entrada varrida da esquerda para a direita, um
smbolo de cada ve/.
1s mtodos de anlise sinttica mais eficientes, tanto top+do4n quanto bottom+
up, trabal5am somente em determinadas subclasses de gramticas, mas vrias dessas
subclasses, como as das gramticas 66 e 67, so suficientemente expressivas para
descrever a maioria das construes sintticas das linguagens de programao. 1s
analisadores implementados manualmente trabal5am frequentemente com gramticas
668 por exemplo. "ssumimos que a sada de um analisador sinttico se)a alguma
representao da rvore gramatical para o fluxo de to!ens produ/ido pelo analisador
lxico. $a prtica, existe um certo n,mero de tarefas que poderiam ser condu/idas
durante a anlise sinttica, tais como coletar informaes sobre os vrios to!ens na
tabela de smbolos, reali/ar a verificao de tipos e outras formas de anlise sem9ntica,
assim como gerar o c.digo intermedirio.
TRATAMENTO DE ERROS DE SINTAXE
:e um compilador tivesse que processar somente programas corretos, seu pro)eto
e sua implementao seriam grandemente simplificados. ;as os programadores
frequentemente escrevem programas incorretos, e um bom compilador deveria assistir o
programador na identificao e locali/ao 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 civili/ao seria radicalmente diferente se as linguagens faladas
tivessem as mesmas exig0ncias de correo sinttica que as das linguagens de
computadores. " maioria das especificaes das linguagens de programao no
descreve como um compilador deveria responder aos erros8 tal tarefa deixada para o
pro)etista desde o incio poderia ser tanto simplificar a estrutura de um compilador
quanto mel5orar sua resposta aos erros.
:abemos que os programas podem conter erros em muitos nveis diferentes. Por
exemplo, os erros podem ser=
lxicos, tais como errar a grafia de um identificador, palavra+c5ave ou operador
sintticos, tais como uma expresso aritmtica com par0nteses no balanceados
sem9nticos, tais como um operador aplicado a um operando incompatvel
l.gicos, tais como uma c5amada infinitamente recursiva
%requentemente, boa parte da deteco e recuperao de erros num compilador
gira em torno da fase de anlise sinttica. >sto porque os erros ou so sintticos por
nature/a ou so expostos quando o fluxo de to!ens proveniente do analisador lxico
desobedece -s regras gramaticais que definem a linguagem de programao. 1utra
ra/o est na preciso dos modernos mtodos de anlise sinttica8 podem detectar muito
eficientemente a presena de erros sintticos num programa. ?etectar precisamente a
presena de erros sem9nticos ou l.gicos em tempo de compilao muito mais difcil.
*m tratador de erros num analisador sinttico possui metas simples de serem
estabelecidas=
+ ?eve relatar a presena de erros clara e acuradamente.
+ ?eve se recuperar de cada erro suficientemente rpido a fim de ser capa/ de detectar
erros subsequentes.
+ $o deve retardar significativamente o processamento de programas corretos.
" reali/ao efetiva dessas metas apresenta desafios difceis.
%eli/mente, os erros comuns so simples e frequentemente basta um mecanismo de
tratamento de erros relativamente direto. Em alguns casos, entretanto, um erro pode ter
ocorrido muito antes de sua presena ter sido detectada e sua nature/a precisa pode ser
muito difcil de ser dedu/ida. Em casos difceis, o tratador de erros pode ter que
adivin5ar o que o programador tin5a em mente quando o programa foi escrito.
@rios mtodos de anlise sinttica, tais como os mtodos 66 e 67, detectam os
erros to cedo quanto possvel. ;ais precisamente, possuem a propriedade do prefixo
vivel, significando que detectam que um erro ocorreu to logo ten5am examinado um
prefixo da entrada que no se)a o de qualquer cadeia da linguagem.
Como deveria um tratador de erros reportar a presena de um erroA $o mnimo,
deveria informar o local no programa fonte onde o mesmo foi detectado, uma ve/ que
existe uma boa c5ance de o erro efetivo ter ocorrido uns poucos to!ens antes. *ma
estratgia comum empregada por muitos compiladores a de imprimir a lin5a ilegal
com um apontador para a posio na qual o erro foi detectado. :e existir um ra/ovel
progn.stico de que o erro realmente foi, uma compreensvel mensagem de diagn.stico
informativa tambm includa8 por exemplo, Bponto+e+vrgula ausente nesta posioC.
*ma ve/ que o erro ten5a sido detectado, como deveria o analisador sinttico se
recuperarA Existe um n,mero de estratgias gerais, mas nen5um mtodo claramente se
impe sobre os demais. $a maioria dos casos, no adequado para o analisador
sinttico encerrar logo ap.s detectar o primeiro erro, porque o processamento da entrada
restante ainda pode revelar outros. *sualmente, existe alguma forma de recuperao de
erros na qual o analisador tenta restaurar a si mesmo para um estado onde o
processamento da entrada possa continuar com uma ra/ovel esperana de que o resto
correto da entrada ser analisado e tratado adequadamente pelo compilador.
*m trabal5o inadequado de recuperao pode introdu/ir uma avalanc5a de erros
Besp,riosC, que no foram cometidos pelo programador, mas introdu/idos pelas
modificaes no estado do analisador sinttico durante a recuperao de erros. $uma
forma similar, uma recuperao de erros sintticos pode introdu/ir erros sem9nticos
esp,rios que sero detectados posteriormente pelas fases de anlise sem9ntica e de
gerao de c.digo. Por exemplo, ao se recuperar de um erro, o analisador pode pular a
declarao de alguma varivel, digamos /ap. Duando /ap for posteriormente encontrada
nas expresses, no 5aver nada sintaticamente errado, mas como no 5 uma entrada
na tabela de smbolos para /ap, a mensagem B/ap no definidoC ser gerada.
*ma estratgia cautelosa para o compilador a de inibir as mensagens de erro
que proven5am de erros descobertos muito proximamente no fluxo de entrada. Em
alguns casos, pode 5aver erros demais para o compilador continuar um processamento
sensvel &por exemplo, como deveria um compilador Pascal responder ao receber um
programa %ortran como entradaA(. Parece que uma estratgia de recuperao de erros
tem que ser um compromisso cuidadosamente considerado levando em conta os tipos de
erros que so mais propensos a ocorrer e ra/oveis de processar.
"lguns compiladores tentam reparar os erros, num processo em que tentam
adivin5ar o que o programador queria escrever. 1 compilador P6EC &Con4a2 e Filcox
GHIJKL( um exemplo desse tipo. Exceto, possivelmente, num ambiente de pequenos
programas escritos por estudantes principiantes, a reparao extensiva de erros no
propensa a pagar o seu custo. ?e fato, com a 0nfase crescente na computao interativa
e bons ambientes de programao, a tend0ncia parece estar na direo de mecanismos
simples de recuperao de erros.
ANLISE SINTTICA TOP-DOWN
" anlise sinttica top+do4n pode ser vista como uma tentativa de ser encontrar
uma derivao 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 rai/, criando os n.s da rvore gramatical em pr ordem.
Consideramos agora uma forma geral de anlise sinttica top+do4n, c5amada de
descend0ncia recursiva, que pode envolver retrocesso, ou se)a, a reali/ao de
esquadrin5amentos repetidos da entrada. Por outro lado, os analisadores sintticos com
retrocesso no so vistos muito frequentemente. *ma ra/o est em que o retrocesso
raramente necessitado para analisar sintaticamente construes de linguagens de
programao. Em situaes tais como a anlise sinttica de linguagens naturais, o
retrocesso ainda ineficiente e mtodos tabulares, tais como o algoritmo de
programao din9mica ou mtodo de Earle2 GHIJML so preferidos.
ANALISADORES SINTTICOS PREDITIVOS
Em muitos casos, escrevendo+se cuidadosamente uma gramtica, eliminando+se
a recurso a esquerda e fatorando+se - esquerda a gramtica resultante, podemos obter
uma nova gramtica processvel por um analisador sinttico de descend0ncia recursiva
que no necessite de retrocesso, isto , um analisador preditivo. Para construir um
analisador sinttico preditivo, precisamos con5ecer, dado o smbolo corrente de entrada
a e o no terminal " a ser expandido, qual das alternativas de produo " - NH O NP O... O
Nn a ,nica que deriva uma cadeia comeando por a. 1u se)a, a alternativa adequada
precisa ser detectvel examinando+se apenas para o primeiro smbolo da cadeia que a
mesma deriva. "s construes de controle de fluxo na maioria das linguagens de
programao, com suas palavras+c5ave distintivas, so usualmente detectveis dessa
forma. Por exemplo, se tivermos as produes=
ANLISE SINTTICA BOTTOM-UP
" anlise sinttica bottom+up con5ecida como anlise de empil5ar e redu/ir. "
anlise gramatical de empil5ar e redu/ir tenta construir uma rvore gramatical para uma
cadeia de entrada comeando pelas fol5as &o fundo( e trabal5ando rvore acima em
direo - rai/ &o topo(. Podemos pensar neste processo como o de Bredu/irC uma cadeia
4 ao smbolo de partida de uma gramtica. " cada passo de reduo, uma subcadeia
particular, que recon5ea o lado direito de uma produo, substituda pelo smbolo -
esquerda daquela produo e, se a subcadeia tiver sido escol5ida corretamente a cada
passo, uma derivao mais - direita ter sido rastreada na ordem inversa.
HANDLES
>nformalmente, um 5andle uma subcadeia que recon5ece o lado direito de uma
produo e cu)a reduo ao no terminal do lado esquerdo da produo representa um
passo ao longo do percurso de uma derivao mais - direita. Em muitos casos, a
subcadeia Q mais - esquerda que recon5ece o lado direito de uma produo "- Q no
um 5andle, porque uma reduo pela produo "- Q produ/ uma cadeia que no pode
ser redu/ida ao smbolo de partida.

Você também pode gostar