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.