Sei sulla pagina 1di 24

Apresentaodadisciplina

Mesmo compreendendo vrios aspectos funcionais de um sistema computacional, a


ideia de criar um programa que seja capaz de transformar as instrues dadas em
cdigofonte em um programa executvel nos parece uma tarefa desafiadora. Esta
disciplina demonstrar que, reunindo conhecimentos de diversas subreas da
computaoeadotandoumametodologiaapropriada,essatarefapodeserrealizadae
comsucesso!
Embora possam ser conduzidos de modo prtico, o projeto e a construo de um
compilador propriamente dito so mais adequados quando se busca uma formao
maisaprofundada,tpicadeumcursodepsgraduao.Aqui,aintenodequeo
alunocompreenda:quaissoastarefasenvolvidasnoprocessodetransformaodos
algoritmoscodificadosemprogramas;amaneiracomoasinformaesrelevantesso
extradasecomopodemsercompreendidasdemaneiraadequada;e,porfim,como
criar uma sequncia funcional anloga utilizando o conjunto de instrues de
mquinasechamadasdesistema,considerandoosaspectosdaarquiteturaescolhida.
Aotrminodocurso, o alunocompreendermelhordiversosaspectosfundamentais
emumalinguagemdeprogramao,relacionarestruturaseconjuntosdecomandos
com seus correlatos em termos de hardware, alm de ter visto um exemplo
consistentedeumprojetomodulareintegrado.

Objetivosgerais
A construo de compiladores um ramo da cincia da computao cujo estudo
agrega conhecimentos e habilidades importantes aos profissionais desta rea, tais
comoumexemplodeestruturaoapropriadadoproblema,abordagemmetodolgica
consistente e necessria ao desenvolvimento de projetos deste porte, alm de
experincias em sistemas que congregam diferentes conhecimentos especficos de
computao.
Dadas as caractersticas de interpretao e traduo de informaes, o estudo dos
conceitosfundamentaisenvolvidosnoprojetoeconstruodecompiladorespermite
uma aplicao mais ampla das tcnicas envolvidas, uma vez que torna o aluno
familiarizadocomoselementosnecessriosescritadeinterpretadoresdecomandos
e programas de interface, bem como ao processamento de dados estruturados e
extensveis.

Objetivosespecficos
Familiarizar os alunos com as principais tcnicas e conceitos envolvidos na
compilao de programas de computador. Aprimorar seus conhecimentos sobre
programao atravs do estudo da estrutura e caractersticas de uma linguagem de
programao, e das tarefas realizadas por um compilador para transformar os
programasemseusequivalentesemlinguagemdemquina.

Conhecer a organizao e as operaes bsicas de um compilador. Compreender o


impacto das caractersticas e paradigmas das diferentes linguagens de programao.
Relacionar os fundamentos de programao com as tarefas desempenhadas pelo
hardware,sendocapazdecompreendermelhoraevoluodasnovasarquiteturasde
computador. Capacitlo no desenvolvimento de ferramentas de gerao de
programas para avaliao e apoio aos processos de engenharia de software,
interpretadores e processadores de dados estruturados e tambm no
desenvolvimentodenovaslinguagenseparadigmasdeprogramao.

Planodeensino
1.Introduo
1.1.Descriodoprocessorealizadopelocomputadorapartirda
codificaodeumalgoritmopeloprogramadoratasuaexecuoemum
computador
1.2.Caracterizaodaslinguagensquantoaonveldeabstrao
1.3.Identificaoediferenciaodoselementosdodomnio
1.3.1.Linguagemfonte,deimplementaoealvo
1.3.2.Compiladores,tradutores,montadoreseinterpretadores
1.3.3.IDEs,debuggers,editoresgrficosdeinterfaceedemais
ferramentasdeapoio
1.4.Modelosparaaconstruodecompiladores
1.4.1.Asetapasdetransformaodocdigo
1.4.2.Compiladoresdeumapassagemedemltiplaspassagens
1.4.3.OmodelodeAnliseeSntese
2.AnliseLxica
2.1.Atransformaodefluxodecaracteresemlistadetokens
2.2.Autmatosfinitosparareconhecimentoeclassificaodetokens
2.3.Identificaodeerroslxicos
3.AnliseSinttica
3.1.Produes(dasGramticasLivresdeContexto)ervoresdederivao
3.2.Descendente(topdown):DescendenteRecursivaeLL
3.3.Ascendente(bottomup):LReLALR

3.4.Abordagensparaotratamentoerecuperaodeerros
4.AnliseSemntica
4.1.Tabeladesmbolos
4.2.Gramticasdeatributos
5.Geraodecdigo
5.1.Cdigosdetrsendereos
5.2.Blocosbsicos
5.3.Diagramasegrafosdedependncia
5.4.Otimizaes
6.Assemblers,linkeditoresecarregadores

Bibliografiabsica
AHO,A.V.;LAM,M.S.;SETHI,R.;ULLMANN,J.D.Compiladores:princpios,tcnicase
ferramentas2ed.SoPaulo:PearsonAddisonWesley,2008.
LOUDEN, K. C. Compiladores: princpios e prticas 1 ed. So Paulo: Pioneira
ThomsonLearning,2004.
TOSCANI, Simao Sirineo; PRICE, Ana Maria de Alencar. Implementao de linguagens
deprogramao:compiladores3Ed.Vol.9Ed.Artmed,2009.

Bibliografiacomplementar
RICARTE,I.Introduocompilao1ed.RiodeJaneiro:Elsevier,2008.
GRUNE, D.; BAL, H. E.; JACOBS, C. J. H.; LANGENDOEN, K. G. Projeto moderno de
compiladores:implementaoeaplicaesRiodeJaneiro:Campus,2001.
APPEL,A.W.ModerncompilerimplementationinJava.London:CambridgeUniversity
Press,1998.
EPSTEIN,RichardL.CARNIELLI,Walter.Computabilidade,funescomputveis,lgicae
osfundamentosdamatemtica.Ed.UNESP,2009.
NIES,Andre.Computabilityandrandomness.Ed.Oxford,UK,2009.

Introduo

Dacodificaoexecuodeumprograma
Algumasperguntasimportantesdeseremrespondidasjdeincioso:Oqueocorre
desdeacodificaodeumalgoritmoporumprogramadoratasuaexecuoemum
computador? Quais so os elementos envolvidos? O que compete a cada um deles
nesteprocesso?
Programador Cdigofonte [Prprocessador] Cdigofonte
sem
macros [Compilador] Cdigoobjeto (.obj) [Linker] Cdigo de mquina
realocvel(.exe) [Carregador] Cdigodemquinaabsoluto
Podemosdescreveresteprocessodaseguintemaneira:
O programador codifica o algoritmo utilizando uma linguagem de programao
(linguagemfonte) e o salva em um arquivo texto (cdigofonte). Antes de ser
compilado,ocdigosubmetidoaumprprocessamentoparaaremoodemacros
e, ento, pode ser passado ao compilador para ser transformado em cdigo de
mquina(cdigoobjeto),deacordocomaplataformaalvo.
Neste novo arquivo criado pelo compilador, habitualmente com extensoobj, temos
apenas o cdigo referente s instrues e funes definidas por este programador,
faltandoaindajuntlocomocdigodemquinarelativosfunesdasbibliotecas.
Para que isso seja feito, um programa realiza a ligao entre os diversos arquivos
objetoseacrescentaoscabealhosnecessriosaosistemaoperacionalparaidentific
loscomoumarquivoexecutvel(cdigodemquinarealocvel).
Quando, ento, desejamos executar o programa, o carregador ouloaderdo sistema
operacional aloca o cdigo em alguma poro de memria que o caiba e que esteja
disponvel,resolvendoosendereosdasvariveisestticasedeentradadefunoat
o momento sob a forma de deslocamentos, por isso sendo chamado de cdigo de
mquinaabsoluto.

Caracterizaodaslinguagensquantoaonveldeabstrao
certodizerquequalquerproblemapodesercodificadousandoqualquerlinguagem,
afinal todo e qualquer programa , de fato, um conjunto de instrues dadas em
linguagemdemquina;masaquesto:serqueissoconveniente?
As linguagens de programao podem ser classificadas de acordo com o grau de
abstraoqueoferecem,ouseja,oquopermissivassoparaqueoprogramadorse
concentre nos aspectos essenciais, ignorando caractersticas menos importantes ou
minciasoperacionais.
Destemodo,aslinguagenscomumaltograudeabstrao,geralmentemaisprximo
da linguagem humana, so chamadas delinguagem de alto nvel, enquanto aquelas
mais prximas das caractersticas e cdigo de mquina, em que o conhecimento de

detalhesrelativosarquiteturaeorganizaosofundamentais,soditaslinguagens
debaixonvel.

Identificaoediferenciaodoselementosdodomnio
Nocontextodecompiladores,importantecompreenderoqueosdiferentes
termosdodomniosignificam.Emboracumprindotarefasparecidas,oscompiladores,
tradutores,montadoreseinterpretadoressoelementosdiferentes.
Compiladores: traduzem programas codificados em linguagens dealto nvelpara
linguagem debaixo nvel. (ex.: C > .EXE, Java > Bytecode ou C# > MSIL (Microsoft
IntermediateLanguage))
Tradutores: traduzem programas codificados em linguagens dealto nvelpara
linguagemdealtonvel.(ex.:Portugus>InglsouC#>Java)
Montadores:traduzemprogramascodificadosemlinguagensdebaixonvel(simblica)
paralinguagemdebaixonvel.(ex.:Assembly>.EXE)
Interpretadores:diferenciamsedosdemaisporrealizarematraduodocdigofonte
etambmexecutlo.(ex.:Browser>HTML,Bash(Linux)>Scripts)

Ferramentasdeapoio
Tm por objetivo aumentar a produtividade no processo de desenvolvimento.
Podemoscitarcomoexemplos:
InterfacesIntegradasdeDesenvolvimento(IDEs):costumeiramenteoferecemdiversos
recursos, mas principalmente auxiliam no gerenciamento de arquivos relativos ao
projeto, permitem a execuo e depurao da aplicao sem que seja necessrio
deixar o ambiente de desenvolvimento, o complemento de comandos e realce de
sintaxe.
Depuradores (debuggers):permitem a execuo passo a passo do cdigo,
acompanhamentodovalordevariveisecontedosdememriaduranteaexecuo,
inserodepontosespecficosdeparada,dentreoutros.
Editores grficos de interface: muito teis em projetos que tenham janelas e outros
elementos grficos; habitualmente permitem a insero e posicionamento de
componentesusandoomouse.

OmodelodeAnliseeSnteseparaaconstruodecompiladores
Este modelo se fundamenta em dividir o processo em duas grandes fases: a anlise,
emqueocdigofonteserverificadoeummodelorepresentativodesuaestruturae

significadosconstrudo;easntese,emqueocdigocorrespondentetraduoser
efetivamenteproduzidodeacordo.
Aanlise lxica(ouscanner) a primeira etapa do processo de compilao e sua
funovarrerocdigofonte,caractereporcaractere,compondooselementosque
de fato formam o programa e que so chamados de tokens ou lexemas.
Adicionalmente, elementos tais como espaos em branco, tabulaes, marcas de
formatao de texto, comentrios ou qualquer outro que sejam irrelevantes ao
processodecompilaosoeliminados.Destemodo,dizemosqueoanalisadorlxico
responsvelportransformarofluxodecaracteresemumfluxodetokens.
Garantida a produo de uma sequncia coerente de lexemas, precisamos ainda
verificar a adequao da estrutura gramatical do programa. A prxima subfase
aanlisesinttica,emquesebuscadeterminarseumasequnciadesmboloslxicos
(cadeia) pode ser gerada pela gramtica que define a linguagem em questo. Essa
tarefaconsisteemconstruirarvoredederivaocorrespondente.
Restaaindaverificarosignificadoouasemnticadoprograma,tarefaexecutadapela
ltima etapa da anlise, a chamadaanlise semntica. de sua responsabilidade
verificar certos aspectos que no foram investigados anteriormente por
impossibilidadeouinadequaodepropsito,taiscomoquestesrelativasaescopo,
regrasdevisibilidadeecompatibilidadeentretipos.
Umavezgarantidoqueocdigofontevlidoecoerente,podesepassaraoprocesso
de sntese. durante agerao de cdigoque efetivamente ocorre a produo do
cdigo equivalente ao programa original. Dado o nvel de dificuldade inerente
diferenaentreosnveisdeabstrao,umaprimeiratentativapodeserrealizadaeseu
produtopassaporumafasedeotimizao,cujoobjetivomelhorarocdigogeradoe
eliminarredundncias,aumentandoodesempenho.

Leiturarecomendada:
Captulo 1, principalmente as sees 1.1 1.4 do livro Compiladores: princpios,
tcnicaseferramentas(LivrodoDrago).
Captulo 1 completo do livro Implementao de linguagens de programao:
compiladores.

Exercciosresolvidos:
1.Umadiscussotpicaentredesenvolvedoresapaixonadosadequealinguagemde
programaodesuaprefernciaamelhor.Umexemplodessesembatesocorreuem
certaocasio,quandoumdesenvolvedorJavaeumprogramadorCtrocavaminsultos
arespeitodalinguagemprediletadooutro,dizendo:
Cumaporcaria!Sequiserportarumaaplicao,vaiterquearrumarocdigofonte
erecompilar...isso,senoderproblema!

Java lento, pois uma linguagem interpretada. Nunca se compara com o


desempenhodeumcdigocompilado!
a)Emqueaspectososcomentriospodemserverdadeiros?
Resp.:Compiladorestraduzemocdigofonteparaumalinguagemalvo,especficade
uma plataforma. Deste modo, se quiser mudar para uma plataforma diferente,
necessriorecompilarocdigofonteconsiderandoanovaarquitetura.Nesseprocesso,
algumasbibliotecasespecficaspodemnotersidoportadasounohaverumaverso
similar que a substitua nesta nova plataforma, causando aborrecimentos ou at
mesmoinviabilizandotodooprocesso.
AlinguagemJavaumbomexemplodetcnicahbrida,poisoscdigosfontesescritos
emJavasocompiladostendocomolinguagemalvoosbytecodesdamquinavirtual.
Quandoexecutados,osprogramasentointerpretadospelamquinavirtuale,dessa
forma, realizam um processo de traduo dos bytecodes do programa para as
instrues da plataforma utilizada naquele momento. certo que o tempo adicional
gasto com a interpretao no seria necessrio se o programa fosse compilado
diretamenteparaaplataformadedestino.
b) De que forma, a linguagem preferida por cada um deles poderia ser considerada
como melhor em relao caracterstica que o interlocutor apontava como uma
deficincianalinguagemdeseudesafeto?
Resp.:UmprogramaemJavasempreexecutadonamquinavirtual.Aportabilidade
se dnopelo programa em si, mas pela mquina virtual,que quem interpretaos
bytecodes nas instrues especficas daquela plataforma. Portanto, supostamente
ondehouverumaversodamquinavirtualimplementadapossvelexecutaraquele
mesmoprogramasemterquecompillonovamente.
O fato de um programa ser compilado uma nica vez permite que seja executado
inmerasvezessemquenenhumprocessodetraduoacontea.Masseemtodasas
vezes que for executado tiver de passar por mais uma etapa, a de interpretao,
certoqueconsumiralgumtemponestatarefaadicional.

2.Conceituecadaumdoselementosdadosaseguir:
a)Linguagemfonteeobjeto;
Resp.:Linguagemfontealinguagemusadaparaescreverprogramasquesoentrada
deprocessadores de linguagens. Linguagemobjeto a linguagem usada para
escreverprogramasquesosadadeprocessadoresdelinguagens.
b)Linguagemdealtonveledebaixonvel;
Resp.: Linguagem de alto nvel a linguagem mais prxima da linguagem natural, e
apresenta como principais caractersticas portabilidade, segurana, legibilidade e uso
deabstraes.Linguagemdebaixonvelalinguagemmaisprximadohardware,e

apresenta como principais caractersticas dependncia da arquitetura, baixa


legibilidade,baixaseguranaepoucoounenhumsuporteparaousodeabstraes.
c)Linguagemdemontagemedemquina;
Resp.: Linguagem de montagem e linguagem de mquina so ambas linguagens de
baixonvel,eporissocompartilhampraticamenteasmesmascaractersticas.Anica
diferena que alinguagem de montagem utiliza mnemnicos para melhorar um
pouco a legibilidade dos programas, ao passo que a linguagem de mquina utiliza
apenasoscdigosnumricos,quesointerpretadospelamquinaalvodiretamente.
d)Discorrasobreasrelaesqueexistementretodosessestiposdelinguagens.
Resp.:Linguagensfonteelinguagensobjetopodemsertantodealtoquantodebaixo
nvel.Conformeaparticularcombinao,nomeiaseoprocessadordelinguagenscomo
compilador, tradutor, filtro, montador etc. Linguagens de alto nvel e de baixo nvel
podem sertanto linguagensfonte quanto linguagensobjeto, dependendo de serem,
respectivamente,entradaousadadeprocessadoresdelinguagens.

AnliseLxica
Antes de tentar converter o algoritmo em cdigo de mquina, devese analisar o
cdigofonte para que seja possvel identificar os elementos que o compem e
assegurarqueestejacorreto,tantoemtermosestruturaisquantosemanticamente.

Cabeaoanalisadorlxicoseparareidentificaroselementosvlidosquecompemo
programafonte, atravs do processamento individual dos caracteres do arquivo de
entrada.Competelheaindaatarefadeeliminaroschamadoselementosdecorativos"
doprograma,isto,caracterestaiscomoespaosembranco,marcasdeformatao
detextoecomentrios.
Issosignificaque,concludaaanliselxica,oselementosutilizadosparaaescritado
programa,taiscomoidentificadores,operadores,delimitadoresepalavrasreservadas
terosidoreconhecidoseidentificados.

Tarefasquelhesopertinentes:
Esquadrinharocdigofonte,smboloasmbolo,compondotokenseclassificandoos
(segundoseusignificadoparaalinguagem);
ComporegerenciarachamadaListadeTokens,umarelaodetodososelementos
identificadospeloscanningemumalistalinear;

Eliminar elementos desnecessrios ao processo de compilao, tais como


comentriosesmbolosdecorativos;
Reconhecerevalidarsequnciasnumricas,quersejaminteiros,reaisououtrabase
suportadapelalinguagem(e.g.hexadecimal);
Reconhecer e validar elementos de definio pelo programador e utilizados como
identificadores;
Proverummecanismoparacontroledeerrosamigvel,hajavistaqueoanalisador
lxico quem varre o cdigofonte e, portanto, o nico que tem referncia da
localidadeemqueumdeterminadotokenocorre(e.g.:mensagemdeerrorelativaao
elementoEdalinhaN).

Comofazlo?
Os tokens possuem uma estrutura sinttica, e deste modo podemos descrever cada
um dos itens da linguagem (palavras reservadas, operadores, delimitadores etc.)
atravsderegrasdeproduo,taiscomo:

identif=letra{letra|dgito}
nmero=dgito{dgito}
if="i""f
igual="=""=

Pensandonisso,inevitavelmentesurgeapergunta:Porqueoanalisadorlxicono
umapartedoanalisadorsinttico?
Observealgunsaspectosquejustificamessadivisodefases:
1. Isso deixaria o analisador sinttico mais complicado de ser construdo, a citar a
dificuldade para distinguir palavras reservadas e identificadores. Porexemplo, uma
regrasintticaquepoderiaserescritaassim:
Statement::=ident"="Expr";"|
"if""("Expr")"...
Precisaria ser reescrita desta forma, para que fosse possvel tratar as duas tarefas
simultaneamente:
Statement::="i"("f""("Expr")"...|notF{letter|digit}"="Expr";")|
notI{letter|digit}"="Expr";".
2. O scanning deve eliminar brancos, tabulaes, fins de linha e comentrios.
Considerando que esses caracteres podem ocorrer em qualquer lugar do cdigo,
teramosdeespecificargramticasmaiscomplexas.Exemplo:
Statement::="if"{Blank}"("{Blank}Expr{Blank}")"{Blank}....
Blank::=""|"\r"|"\n"|"\t"|Comment.

3.Tokenspodemserdescritosporgramticasregulares,quesomaissimplesemais
eficientes que as gramticas livres de contexto. A maioria das estruturas lxicas so
regulares:
Nomes::=letra{letra|dgito}
Nmeros::=dgito{dgito}
Strings::="\""{qqCaractereExcetoAspas}"\""
Palavrasreservadas::=letra{letra}
Operadores::=>|=|+|...
4. Gramticas regulares no podem lidar com estruturas aninhadas, pois no so
capazes de manipular recurso central. Esse tipo de construo importante na
maioriadaslinguagensdeprogramao.
ExpressesaninhadasExpr..."("Expr")"...
ComandosaninhadosComando"do"Comando"while""("Expr")"
ClassesaninhadasClasse"class""{"...Classe..."}"
Osautmatosfinitospodemreconhecerlinguagensregulares.Assim,podemosdefinir
oscannercomoumAFDquereconheaoselementosdalinguagemfonte.
Oprocessamentodecadacaractereobtidoserregidopelastransiesprevistaspelo
autmato,demodoqueoAFDterreconhecidoumasentena:
Seaentradativersidoconsumidatotalmente;ou
Senoforpossvelrealizarumatransiocomoprximosmbolodaentradaeo
autmatoencontrarseemumestadofinal.
Vejaumexemplonoesquemaaseguir:

Leiturarecomendada:
Captulo 1, principalmente as sees 1.1 1.4 do livro Compiladores: princpios,
tcnicaseferramentas(LivrodoDrago).

Captulo 1 completo do livro Implementao de linguagens de programao:


compiladores

Exerccioresolvido:
1) Em meio a um cdigofonte, h elementos considerados desnecessrios ao
processodecompilao,taiscomoespaosembrancoequebrasdelinha,dentre
outros.Seosespaosembrancosonecessriosparaquesepossasepararuma
palavradeoutra,entodequemodosoconsideradosdesnecessrios?

Resp.: Apenas um caractere de espao necessrio para separar uma palavra de


outra,entoocorrnciasconsecutivassodesnecessriasparaessepropsito.Mas
atmesmoestenicoespaoperdesuautilidadeapsaidentificaodotrmino
do token em formao e, consequentemente, tambm pode ser descartado aps
cumprircomoseupropsito.

AnliseSinttica(Introduo)
Visogeraldoprocesso
Tendoafunodeverificarseasconstruesutilizadasnocdigofonteestona
formaapropriada,aanlisesintticatemaresponsabilidadede:
DadaumagramticalivredecontextoGeumasentenas,aquirepresentadapelo
programafonte,oanalisadorsintticotemopropsitodeverificarsespertence
linguagemgeradaporG.Emoutraspalavras,apartirdostokensfornecidospelo
analisadorlxico,tentarconstruirarvoredederivaoparassegundoasregrasde
produodadaspelagramticaG.Seestatarefaforpossvel,oprograma
consideradosintaticamentecorreto.

Tarefasquelhesopertinentes:
>Comprovarqueasequnciadetokenscumpreasregrasgramaticais;e
>Gerararvoregramaticaldoprograma.
Assim,entendemosquesodesuacompetncia:
Aidentificaodeerrosdesintaxe,porexemplo:A*/B;
Acorretainterpretaodaestruturahierrquicaeaevoluodasentena,mesmo
quandosobaspectosimplcitos.(ex.:A/B*Cserentendidacomo(A/B)*Cem
FortraneA/(B*C)emAPL);
Acapacidadedetratamentoe/ourecuperaodeerrosdesintaxe.Valeressaltar,
emrelaoaesseaspecto,oprojetodeoferecerrecursossuficientes;mastambm

tenha o cuidado de no retardar de forma significativa o processamento de


programascorretos.
H claras vantagens na utilizao de gramticas para especificar linguagens de
programaoeprojetarcompiladores,acitar:
Especificaessintticasprecisasdelinguagens;
Possibilidadedeusodeferramentasparaageraoautomticadoparser;
Possibilidade de identificar ambiguidades durante o processo de
especificao/construo;
Facilidadesparaampliaroumodificaralinguagem.

Tratamento/Recuperaodeerros
Em geral, programas contm erros. Assim, um bom compilador deve, na medida do
possvel, detectar todos os erros ocorridos, avisar o usurio de suas ocorrncias e
recuperarsedeles,demodoquesejapossvelanalisarorestantedocdigofonte.
Aimplementaodeumbommecanismodedetecoerecuperaodeerrosmuitas
vezesdependedaquestoserconsideradadesdeoinciodoprojetodalinguagem.
Modopnicooudesespero
Param imediatamente diante do primeiro erro ou, identificado um erro, o
analisador sinttico descarta smbolos de entrada, at que seja encontrado um
token pertencente ao subconjunto de tokens de sincronizao (e.g.: ponto e
vrgula,delimitadoresetc.).
Recuperaodefrases
Ao descobrir um erro, o analisador sinttico pode tentar uma recuperao
realizando uma correo local na entrada restante, substituindoa por alguma
cadeia que permita que a anlise prossiga. Por exemplo, substituir uma vrgula
inadequadaporumpontoevrgula,ouaindaremoverum:excedente.
Produesdeerro
Modificar a gramtica incluindo regras de produo estratgicas, de modo a
acomodar os erros mais comuns. Assim, sempre que uma produo de erro for
identificada pelo analisador, possvel conduzir o tratamento mais adequado
quelasituaoemespecial.
Correoglobal
Emgeral,empregaalgoritmosqueescolhem,entrepossveissolues,aquelaque
apresentaumasequnciamnimademudanasparaqueseobtenhaumacorreo
globaldoprogramaenodoserrosindividualmente.

Alguns dados interessantes que devem ser considerados quando se pensa em quo
eficiente deve ser o mtodo de tratamento e recuperao de erros versus o tempo
demandadoparaqueoperedemodosatisfatrio:
Cerca de 60% dos programas so compilados de modo correto sinttica e
semanticamente. Dentre os que apresentam erros: cerca de 80% dos enunciados
apresentam apenas um erro e 13% apresentam apenas dois erros. Em
aproximadamente90%doscasos,oserrosenvolvemumnicotoken.

Anlisesintticadescendenteeascendente
Osmtodosdeanlisesintticapodemserclassificadossegundoamaneirapelaquala
rvoredederivaodacadeiaanalisadaxconstruda:

Nosmtodosdescendentes,arvoredederivaocorrespondenteaxconstruda
de cima para baixo, ou seja, da raiz (o smbolo inicial S) para as folhas, onde se
encontrax.
Nosmtodosascendentes,arvoredederivaocorrespondenteaxconstruda
de baixo para cima, ou seja, das folhas, onde se encontra x, para a raiz, onde se
encontraosmboloinicialS.

Nos mtodos descendentes (topdown), temos de decidir qual a regra A a ser


aplicadaaumnrotuladoporumnoterminalA.AexpansodeAfeitacriandons
filhosrotuladoscomossmbolosde.
Nos mtodos ascendentes (bottomup), temos de decidir quando a regra Adeve
ser aplicada, e devemos encontrar ns vizinhos rotulados com os smbolos de. A
reduopelaregraAconsisteemacrescentarrvoreumnA,cujosfilhossoos
nscorrespondentesaossmbolosde.
Mtodosdescendenteseascendentesconstroemarvoredaesquerdaparaadireita.
Arazoparaissoqueaescolhadasregrasdevesebasearnacadeiaasergerada,que
lidadaesquerdaparaadireita.(Seriamuitoestranhoumcompiladorquecomeasse
apartirdofimdoprogramaemdireoaoincio).
Exemplo:
Considereacadeiax=a+a*aeagramtica:
1.EE+T
2.ET
3.TT*F
4.TF
5.F(E)
6.Fa

Usandose um mtodo descendente, a rvore de derivao de x construda na


sequnciaespecificadaconformedadonafiguraabaixo:

Notequeasregrassoconsideradasnaordem12463466,amesmaordememque
as
regras
so
usadas
na
derivao
esquerda:EE+TT+Ta+Ta+T*Fa+F*Fa+a*Fa+a*a
Porm,seusarmosummtododeanliseascendente,asregrassoidentificadasna
ordem64264631,eospassosdeconstruodarvorepodemservistosnafiguraa
seguir:

Embora a rvore de derivao seja usada para descrever os mtodos de anlise, na


prtica ela nunca efetivamente construda. s vezes, se necessrio, construmos
rvoressintticas,queguardamalgumasemelhanacomarvoredederivao,mas
ocupamumespaodememriasignificativamentemenor.Anicaestruturadedados
necessria para o processo de anlise uma pilha, que guarda informao sobre os
nsdarvoredederivaorelevantesemcadafasedoprocesso.
Nocasodaanlisedescendente,osnsrelevantessoaquelesaindanoexpandidos;
nocasodaanliseascendente,soasrazesdasrvoresqueaindanoforamreunidas
emrvoresmaiores.

TiposdeAnalisadoresSintticos:
MtodosdeCockeYoungerKasamieEarly

o universais:servemparaqualquergramtica(bemeficientes).
Mtodos descendentes (topdown): constroem a rvore sinttica de cima para
baixo
o AnalisadoresDescendentesRecursivos
o AnalisadoresLL(k)
Mtodos ascendentes (bottomup): constroem a rvore sinttica de baixo para
cima
o AnalisadoresSR
o AnalisadoresLR
o AnalisadoresLALR

Leiturarecomendada:
Captulo 4, sees 4.1 e 4.2 do livro Compiladores: princpios, tcnicas e ferramentas
(LivrodoDrago).
Captulo 3, seo 3.1 do livro Implementao de linguagens de programao:
compiladores.

Exercciosresolvidos:
1.Conceituecadaumdositensdadosaseguir:

Anlisesintticadeterminsticaxnodeterminstica;
Anlisesintticadescendentexascendente;
GramticaelinguagemLL(1)eLR(1).

Resp.:Aanlisedeterminsticaaquelaemquetodasasdecisesdemovimentaodo
reconhecedor so tomadas "sem arrependimento". Se no houver movimentao
possvel, isso indica a ocorrncia de um erro na cadeia de entrada. A anlise
nodeterminstica, por outro lado, opera por tentativa e erro. Erros na cadeia de
entrada so apontados apenas depois de esgotadas todas as possibilidades de
movimentao.
A anlise descentente, tambm conhecida como topdown, aquela em que o
reconhecedoriniciaosseusmovimentosnaraizdagramticaeevoluiatacadeiade
entrada (em termos de rvore, aquela em que a rvore montada de cima para
baixo). A anlise ascendente, ou bottomup, aquela em que os movimentos do
reconhecedor vo da cadeia entrada em direo raiz da gramtica (a rvore
montadadebaixoparacima).
UmaGramticaLL(1)aquelaquegeraumalinguagemquepodeserreconhecidada
esquerda para a direita, usando derivaes mais esquerda e com lookahead de
apenas um smbolo. Linguagem LL(1) aquela que pode ser gerada por alguma
gramtica LL(1). Gramtica LR(1) aquela que gera uma linguagem que pode ser

reconhecida da esquerda para a direita, usando redues mais esquerda e com


lookaheaddeapenasumsmbolo.LinguagemLR(1)aquelaquepodesergeradapor
algumaGramticaLR(1).

2. Considere a gramtica abaixo, sobre o alfabeto ={(,),a,,}:


L(S)
SI,S|I
Ia|L

a)Mostreosmovimentosdeumreconhecedorascendentenaanliseda
sentena (a,(a),(a,a));
b)Mostreosmovimentosdeumreconhecedordescendentenaanliseda
sentena (a,(a),(a,a));
c)Obtenhaoesboodeumreconhecedorrecursivodescendenteparaalinguagempor
eladefinida.
Resp.itema:Osmovimentosdeumreconhecedorascendentesero:
(a,(a),(a,a))(I,(a),(a,a))(I,(I),(a,a))(I,(S),(a,a))
(I,L,(a,a))(I,I,(a,a))(I,I,(I,a))(I,I,(I,I))(I,
I,(I,S))(I,I,(S))(I,I,L)(I,I,I)(I,I,S)(I,S)
(S)L
Resp.itemb:Osmovimentosparaoreconhecedordescendentesero:
L(S)(I,S)(a,S)(a,I,S)(a,L,S)(a,(S),S)
(a,(I),S)(a,(a),S)(a,(a),I)(a,(a),L)(a,(a),(S))
(a,(a),(I,S))(a,(a),(a,S))(a,(a),(a,I))(a,(a),(a,a))
Resp.itemc:Umreconhecedorrecursivoobtidotranscrevendocadaumadasregras
deproduodagramticacomoumasubrotinaresponsvelporconsumirostokens
dacadeiagerada.Semprequeencontrarmosumsmbolonoterminalnasentena,
realizaseachamadasubrotinacorrespondente;e,quandoencontramosumsmbolo
terminalnaregra,verificamossecorrespondeaosmbolodadonaentrada(posio
correntedeanlisedecdigofonte).Deacordocomessesconceitos,poderamostero
seguintecdigoparaestagramtica:
voidparseL(){
accept("(");
parseS();
accept(")");
}

voidparseS(){
parseI();
whiles==","{
acceptIt();
parseI();
}

voidparseI(){
switchs{
case"a":acceptIt();
break();
case"(":parseS();
break;

AnliseSintticaIAnliseDescendente

defaul:ERRO();
}
}

Arepresentaodoprocessoserfeitaatravsdeconfiguraes(,y),emque ey
representam, respectivamente, o contedo da pilha e orestoda entrada ainda no
analisada.Porconveno,vamossuporqueotopodapilhaficaesquerda,isto,que
oprimeirosmbolode osmbolodotopodapilha.
Existemduasformasdetransiodeumaconfiguraoparaoutra:
(1)expansodeumnoterminalpelaregraA:permitepassardaconfigurao(A,
y)paraaconfigurao(,y).
(2)verificao de um terminal s: permite passar da configurao (s, sy) para a
configurao(,y).
Osegundotipodetransioservepararetirarterminaisdotopodapilhaeneleexpor
oprximonoterminalaserexpandido.Aconfiguraoinicialparaaentradax(S,x);
o processo termina na configurao (,), com a pilha vazia, e a entrada toda
considerada.

Exemplo:Mostramos abaixo as configuraes sucessivas de um analisador


descendente,paraacadeiax.Paraacompanhamento,aterceiracolunaapresentaos
passos correspondentes da derivao esquerda de x. Note que apenas os passos de
expansotmcorrespondentenaderivao.
Pilha
(topoesquerda)
E
E+T
T+T
F+T
a+T
+T
T
T*F
F*F
A*F
*F
F
a

AnliseSintticaLL(1)

(restanteda)
Entrada
a+a*a
a+a*a
a+a*a
a+a*a
a+a*a
+a*a
a*a
a*a
a*a
a*a
*a
a
a

Derivaoesquerda
(leftmost)
E
E+T
T+T
F+T
a+T

a+T*F
a+F*F
a+a*F

a+a*a

Nestemtodo,aescolhadaregraaserusadaduranteoprocessodeanlise
descendentesedatravsdeduasinformaes:onoterminalAaserexpandidoeo
primeirosmboloadorestodaentrada.
UmatabelaMindexadaporestasduasentradasnosfornecearegraaserutilizada:
M[A,a].Valeressaltarqueessatcnicaspodeserempregadaparaumaclasse
restritadegramticas,aschamadasgramticasLL(1).
OnomeLL(1)indicaque:

Acadeiadeentradaexaminadadaesquerdaparaadireita(L=lefttoright);
Oanalisadorprocuraconstruirumaderivaoesquerda(L=leftmost);
Exatamente1smbolodorestodaentradaexaminado.

ExemploSuponhaagramticaaseguir:
1.
2.
3.
4.
5.
6.
7.
8.

ETE'
TFT'
F(E)
Fa
E'+TE'
E'
T'*FT'
T'

EssagramticaLL(1)e,assim,asuatabeladeanliseMser:

E
T
F
E'
T'

(
1
2
3

a
1
2
4

5
8

6
8

6
8

Nessatabela,aentradaM[S,k]correspondenteaonoterminalSeaoterminalktem
onmerodaregraquedeveserusadaparaexpansodeS.Asentradasindicadaspor
""correspondemaerros,ouseja,socombinaesquenopodemocorrerdurantea
anlisedecadeiasdalinguagem.
Paraanalisaracadeiaa+a*a,teremosasseguintesconfiguraes:
Pilha
E
TE'
FT'E'
aT'E'
T'E'

Entrada
a+a*a
a+a*a
a+a*a
a+a*a
+a*a

Escolhadaregra
M[E,a]=1
M[T,a]=2
M[F,a]=4

M[T',+]=8

E'
+TE'
TE'
FT'E'
aT'E'
T'E'
*FT'E'
FT'E'
aT'E'
T'E'
E'

+a*a
+a*a
a*a
a*a
a*a
*a
*a
a
a

M[E',+]=5

M[T,a]=2
M[F,a]=4

M[T',*]=7

M[F,a]=4

M[T',$]=8
M[E',$]=6

Vamos,agora,mostrarcomoconstruirM,atabeladeanliseLL(1).Nocasomais
simples,osmboloa(oprimeirodorestodaentrada)oprimeirosmboloderivadodo
noterminalaserexpandidoA,efazpartedeFirst(A).Nestecaso,adevepertencera
First(),emqueAumadasalternativasderegraparaA.Comoilustrao,
podemosverque,noexemploacima,aregraF(E)foiusadacomosmbolo(.
OutrapossibilidadeadequenosejaAonoterminalresponsvelpelageraodo
smboloa,massimalgumoutronoterminalencontradodepoisdeA.Nestecaso,
devemosterapertencendoaoFollow(A).Comoilustrao,podemosverque,no
exemploacima,aregraT'foiusadacomosmbolo+.
ParaconstruiratabelaM,vamosexaminartodasasregrasdagramtica:

Paracadaregrai:A,temosM[A,a]=i,paracadaaemFirst().
Paracadaregrai:A,se*,temosM[A,a]=i,paracadaaemFollow(A).

SeagramticaLL(1),cadaentradadeMrecebernomximoumvalor.Asentradas
deMquenoreceberemnenhumvalordevemsermarcadascomoentradasdeerro.
CasoalgumaentradadeMsejadefinidamaisdeumavez,dizemosquehouveum
conflito,equeagramticanoLL(1).

ExemploConsidereagramticadadanoexemploanterior.EssagramticaLL(1),ea
tabeladeanliseMpodeserconstrudacomoindicado.Temos,paracadaregra:
1.ETE'
2.TFT'
3.F(E)
4.Fa
5.E'+TE'
6.E'
7.T'*FT'
8.T'

First(TE')={(,a}
First(FT')={(,a}
First((E))={(}
First(a)={a}
First(+TE')={+}
Follow(E')={$,)}
First(*FT')={*}
Follow(T')={$,+,)}

M[E,(]=1eM[E,a]=1
M[T,(]=2eM[T,a]=2
M[F,(]=3
M[F,a]=4
M[E',+]=5
M[E',$]=6eM[E',)]=6
M[T',*]=7
M[T',$]=8,M[T',+]=8eM[T',)]

=8

ExemploConsidereagramticadadaabaixo,esquerda.Teremos:
1.EE+T
2.ET
3.TT*F
4.TF
5.F(E)
6.Fa

First(E+T)={(,a}
First(T)={(,a}
First(T?F)={(,a}
First(F)={(,a}
First((E))={(}
First(a)={a}

M[E,(]=1eM[E,a]=1
M[E,(]=2eM[E,a]=2
M[T,(]=3eM[T,a]=3
M[T,(]=4eM[T,a]=4
M[F,(]=5
M[F,a]=6

Consequentemente,agramticanoLL(1),porcausadosconflitos(mltiplas
definies)paraM[E,(],M[E,a],M[T,(]eM[T,a].Emalgunscasos,comooda
gramticadoexemploanterior,possvelconcluirqueagramticanoLL(1)por
inspeo.Asduascaractersticasmaisbviasso:arecursoesquerdaea
possibilidadedefatorao.

Recursoesquerda:
SeumagramticapermiteumaderivaoA*A,paraalgumnoterminalAepara
algumacadeianovazia,agramticaditarecursivaesquerda.
Nocasomaissimples,existenagramticaumaregraAAresponsveldiretamente
peladerivaomencionada.ParaqueAnosejaumnoterminalintil,deveexistirna
gramtica(pelomenos)umaregradaformaA,semrecursoesquerda.
AcombinaodessasduasregrasfazcomqueFirst(A)e,portanto,First(A)
contenhamtodosossmbolosdeFirst(),eissolevanecessariamenteaumconflito.A
eliminaodarecursoesquerdapodesertentada,procurandotransformara
gramticaemumagramticaLL(1).
Observarqueacombinao:
AA
A
Permiteageraodecadeiasdaforma,equeessasmesmascadeiaspodem
sergeradasdeoutramaneira.Porexemplo:
AA'
A'A'
A'
Estaoutraformadegeraousarecursodireita,quenocriaproblemas.

Prefixoscomuns
Tratasedocasoemqueduasregrascomeamcomomesmosmboloouconjuntode
smbolos(prefixo),isto,regrascomoAeA,comFirst().Nestecaso,
existeumainterseoentreFirst()eFirst(),eagramticanopodeserLL(1).
Istoaconteceporquenopossveldecidir,olhandoapenasoprimeirosmbolo
derivadode,qualaregracorreta.Asoluosimpleseenvolveafatorao.
Suponhaasregrasabaixo:
A
A
Podemosreescreveressasregrasemequivalentes,demodoacolocaroprefixoem
umaregraeadiaradecisoentreeparaquandooprimeirosmboloderivado
deoudeestivervisvel.
AA'
A'
A'

EstasduastcnicaspermitemtransformaralgumasgramticasemgramticasLL(1).
Entretanto,valeressaltarquealgumasgramticaslivresdecontextoGLCnotm
gramticasequivalentesLL(1).Nessecaso,aaplicaodessastcnicasoumesmode
outraspodernotersucesso.

ExemploConsidereagramticaaseguir:
1.EE+T|T
2.TT*F|F
3.F(E)|a
Estagramticaapresentaduassituaesderecursoesquerda.Fazendoas
substituiesindicadas,temos:
1.ETE'
2.E'+TE'|

3.TFT'
4.T'*FT'|
5.F(E)|a
EestagramticaLL(1),comojfoivistoanteriormente.

ExemploSuponhatransformaragramticaabaixoemumagramticaLL(1)
equivalente:
1.LL;S|S
2.SifEthLelLfi|ifEthLfi|s
3.Ee
TemosrecursoesquerdanasregrasdeL,epossibilidadedefatoraonasregrasde
S.UmatransformaodestagramticaemLL(1)teriaoseguinteresultado:
1.LSL'
2.L';SL'|
3.SifEthLS'|s
4.S'elLfi|fi
5.Ee
Novamente,podemosverificarqueestaumagramticaLL(1).

Leiturarecomendada:
Captulo4,seo4.4dolivroCompiladores:princpios,tcnicaseferramentas(Livrodo
Drago)
Captulo 3, seo 3.2 do livro Implementao de linguagens de programao:
compiladores

Exercciosresolvidos:
1.Considereagramticaabaixo:
SaXb|aYc|aaZd
XbX|bc

YcY|cb
ZdZ|

a)EssagramticaLL(1)?Proveasuaresposta.
b)CasoagramticaacimanosejaLL(1),obtenhaumagramticaequivalenteque
sejaLL(1)eprovequeanovagramtica,defato,LL(1).
Resp.itema:No,poisosconjuntosFirstnosodisjuntos.Emtodasasregras
encontramosprefixosiguaisparaaspossveisderivaesdecadaregra,querde
maneiradiretaouindireta.Notequeissoserefletediretamentenosvaloresincludos
nosconjuntosFirsteFollow,conformedadosabaixo:
First(aXb)={a},First(aYc)={a},First(aaZd)={a}
First(bX)={b},First(bc)={b}
First(cY)={c},First(cb)={c}
First(dZ)={d},follow(Z)={d}
Resp.itemb:Eliminandorecursesefazendosubstituiesdossmbolosnas
construesdadasporS,teremos:Sab*bcb|ac*cbc|aad*d.Fatorandoastrs
diferentespossibilidadesdederivaoparaosmboloS,ficaramoscomaseguinte
regra:Sa(b*bcb|c*cbc|ad*d)
possvelobservarqueessagramticanoapresentarecursesesquerda,umavez
quederivadiretamentedesentenascompostasapenasdesmbolosterminais.Alm
disso,tambmnotasequeosprefixosparacadaumadaspossveisderivaesapso
primeirosmboloasodiferentesparaostrscasospossveis.Estesaspectospodem
serconfirmadosquandocalculamososconjutosFirstparacadaumadastrs
possibilidadesdederivaoapresentadasparaosmboloS:First(b*bcb)={b};First
(c*cbc)={c}eFirst(aad*d)={a}

2.Obtenhaoesboodeumreconhecedor,atravsdomtodorecursivodescendente,
para a linguagem definida pela expresso:(+||)(d+(|.|.d*)|.d+)(e(+|
|)d+|)
So exemplos de sentenas pertencentes
45.312,+.76,5.44e2,+0.88e35.

essa

linguagem:123,

Resp.:Um reconhecedor recursivo transcreve a regra de produo como uma sub


rotina responsvel por consumir um de seus tokens na ordem em que so dados.
Semprequeencontrarmosumsmboloquepodeounoocorrernasentena,devemos
terocuidadoparanoreportarumerroindevidamente.Assim,paraaexpressodada,
poderamosteroseguintecdigo:
voidparseNumero(){
ifs=="+"takeIt();

elseifs==""takeIt();
ifs=="d"{
takeIt();
whiles=="d"takeIt();
ifs=="."{
takeIt();
whiles=="d"takeIt();
}
}
elseifs=="."{
takeIt();take("d");
whiles=="d"takeIt();
}
elseERRO();
ifs=="e"{
takeIt();
ifs=="+"takeIt()
elseifs==""takeIt();
take("d");
whiles=="d"takeIt();
}

Potrebbero piacerti anche