compiladores e computabilidade unidade i r

24
Apresentação da disciplina Mesmo compreendendo vários aspectos funcionais de um sistema computacional, a ideia de criar um programa que seja capaz de transformar as instruções dadas em códigofonte em um programa executável nos parece uma tarefa desafiadora. Esta disciplina demonstrará que, reunindo conhecimentos de diversas subáreas da computação e adotando uma metodologia apropriada, essa tarefa pode ser realizada e com sucesso! Embora possam ser conduzidos de modo prático, o projeto e a construção de um compilador propriamente dito são mais adequados quando se busca uma formação mais aprofundada, típica de um curso de pósgraduação. Aqui, a intenção é de que o aluno compreenda: quais são as tarefas envolvidas no processo de transformação dos algoritmos codificados em programas; a maneira como as informações relevantes são extraídas e como podem ser compreendidas de maneira adequada; e, por fim, como criar uma sequência funcional análoga utilizando o conjunto de instruções de máquinas e chamadas de sistema, considerando os aspectos da arquitetura escolhida. Ao término do curso, o aluno compreenderá melhor diversos aspectos fundamentais em uma linguagem de programação, relacionará estruturas e conjuntos de comandos com seus correlatos em termos de hardware, além de ter visto um exemplo consistente de um projeto modular e integrado. Objetivos gerais A construção de compiladores é um ramo da ciência da computação cujo estudo agrega conhecimentos e habilidades importantes aos profissionais desta área, tais como um exemplo de estruturação apropriada do problema, abordagem metodológica consistente e necessária ao desenvolvimento de projetos deste porte, além de experiências em sistemas que congregam diferentes conhecimentos específicos de computação. Dadas as características de interpretação e tradução de informações, o estudo dos conceitos fundamentais envolvidos no projeto e construção de compiladores permite uma aplicação mais ampla das técnicas envolvidas, uma vez que torna o aluno familiarizado com os elementos necessários à escrita de interpretadores de comandos e programas de interface, bem como ao processamento de dados estruturados e extensíveis. Objetivos específicos Familiarizar os alunos com as principais técnicas e conceitos envolvidos na compilação de programas de computador. Aprimorar seus conhecimentos sobre programação através do estudo da estrutura e características de uma linguagem de programação, e das tarefas realizadas por um compilador para transformar os programas em seus equivalentes em linguagem de máquina.

Upload: fabio-adriano

Post on 17-Aug-2015

242 views

Category:

Documents


4 download

DESCRIPTION

UNIP

TRANSCRIPT

Apresentaodadisciplina Mesmo compreendendo vrios aspectos funcionais de um sistema computacional, aideia de criar um programa que seja capaz de transformar as instrues dadas emcdigofonte em um programa executvel nos parece uma tarefa desafiadora. Estadisciplina demonstrar que, reunindo conhecimentos de diversas subreas dacomputaoeadotandoumametodologiaapropriada,essatarefapodeserrealizadaecomsucesso! Embora possam ser conduzidos de modo prtico, o projeto e a construo de umcompilador propriamente dito so mais adequados quando se busca uma formaomais aprofundada, tpica de um curso de psgraduao. Aqui, a inteno de que oalunocompreenda:quaissoastarefasenvolvidasnoprocessodetransformaodosalgoritmoscodificadosemprogramas;amaneiracomoasinformaesrelevantessoextradas e como podem ser compreendidas de maneira adequada; e, por fim, comocriar uma sequncia funcional anloga utilizando o conjunto de instrues demquinasechamadasdesistema,considerandoosaspectosdaarquiteturaescolhida. Ao trmino do curso, o aluno compreender melhor diversos aspectos fundamentaisem uma linguagem deprogramao, relacionar estruturas e conjuntos de comandoscom seus correlatos em termos de hardware, alm de ter visto um exemploconsistentedeumprojetomodulareintegrado. Objetivosgerais A construo de compiladores um ramo da cincia da computao cujo estudoagrega conhecimentos e habilidades importantes aos profissionais desta rea, taiscomoumexemplodeestruturaoapropriadadoproblema,abordagemmetodolgicaconsistente e necessria ao desenvolvimento de projetos deste porte, alm deexperincias em sistemas que congregam diferentes conhecimentos especficos decomputao. Dadas as caractersticas de interpretao e traduo de informaes, o estudo dosconceitos fundamentais envolvidos no projeto e construo de compiladores permiteuma aplicao mais ampla das tcnicas envolvidas, uma vez que torna o alunofamiliarizadocomoselementosnecessriosescritadeinterpretadoresdecomandose programas de interface, bem como ao processamento de dados estruturados eextensveis. Objetivosespecficos Familiarizar os alunos com as principais tcnicas e conceitos envolvidos nacompilao de programas de computador. Aprimorar seus conhecimentos sobreprogramao atravs do estudo da estrutura e caractersticas de uma linguagem deprogramao, e das tarefas realizadas por um compilador para transformar osprogramasemseusequivalentesemlinguagemdemquina. Conhecer a organizao e as operaes bsicas de um compilador. Compreender oimpacto das caractersticas e paradigmas das diferentes linguagens de programao.Relacionar os fundamentos de programao com as tarefas desempenhadas pelohardware,sendocapazdecompreendermelhoraevoluodasnovasarquiteturasdecomputador. Capacitlo no desenvolvimento de ferramentas de gerao deprogramas para avaliao e apoio aos processos de engenharia de software,interpretadores e processadores de dados estruturados e tambm nodesenvolvimentodenovaslinguagenseparadigmasdeprogramao. Planodeensino 1.Introduo 1.1.Descriodoprocessorealizadopelocomputadorapartirdacodificaodeumalgoritmopeloprogramadoratasuaexecuoemumcomputador 1.2.Caracterizaodaslinguagensquantoaonveldeabstrao 1.3.Identificaoediferenciaodoselementosdodomnio 1.3.1.Linguagemfonte,deimplementaoealvo 1.3.2.Compiladores,tradutores,montadoreseinterpretadores 1.3.3.IDEs,debuggers,editoresgrficosdeinterfaceedemaisferramentasdeapoio 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,tcnicaseferramentas2ed.SoPaulo:PearsonAddisonWesley,2008. LOUDEN, K. C. Compiladores: princpios e prticas 1 ed. So Paulo: PioneiraThomsonLearning,2004. TOSCANI, Simao Sirineo; PRICE, Ana Maria de Alencar. Implementao de linguagensdeprogramao: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 decompiladores:implementaoeaplicaesRiodeJaneiro:Campus,2001. APPEL,A.W.ModerncompilerimplementationinJava.London:CambridgeUniversityPress,1998. EPSTEIN,RichardL.CARNIELLI,Walter.Computabilidade,funescomputveis,lgicaeosfundamentosdamatemtica.Ed.UNESP,2009. NIES,Andre.Computabilityandrandomness.Ed.Oxford,UK,2009. IntroduoDacodificaoexecuodeumprograma Algumas perguntas importantes de serem respondidas j de incio so: O que ocorredesdeacodificaodeumalgoritmoporumprogramadoratasuaexecuoemumcomputador? Quais so os elementos envolvidos? O que compete a cada um delesnesteprocesso? ProgramadorCdigofonte[Prprocessador]Cdigofonte semmacros[Compilador]Cdigoobjeto (.obj)[Linker]Cdigo de mquinarealocvel(.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 sercompilado,ocdigosubmetidoaumprprocessamentoparaaremoodemacrose, ento, pode ser passado ao compilador para ser transformado em cdigo demquina(cdigoobjeto),deacordocomaplataformaalvo. Neste novo arquivo criado pelo compilador, habitualmente com extensoobj, temosapenas o cdigo referente s instrues e funes definidas por este programador,faltando ainda juntlo com o cdigo de mquina relativo s funes das bibliotecas.Para que isso seja feito, um programa realiza a ligao entre os diversos arquivosobjetoseacrescentaoscabealhosnecessriosaosistemaoperacionalparaidentificloscomoumarquivoexecutvel(cdigodemquinarealocvel). Quando, ento, desejamos executar o programa, o carregador ouloaderdo sistemaoperacional aloca o cdigo em alguma poro de memria que o caiba e que estejadisponvel,resolvendoosendereosdasvariveisestticasedeentradadefunoato momento sob a forma de deslocamentos, por isso sendo chamado de cdigo demquinaabsoluto. Caracterizaodaslinguagensquantoaonveldeabstrao certodizerquequalquerproblemapodesercodificadousandoqualquerlinguagem,afinal todo e qualquer programa , de fato, um conjunto de instrues dadas emlinguagemdemquina;masaquesto:serqueissoconveniente? As linguagens de programao podem ser classificadas de acordo com o grau deabstrao que oferecem, ou seja, o quo permissivas so para que o programador seconcentre nos aspectos essenciais, ignorando caractersticas menos importantes ouminciasoperacionais. Deste modo, as linguagens com um alto grau de abstrao, geralmente mais prximoda linguagem humana, so chamadas delinguagem de alto nvel, enquanto aquelasmais prximas das caractersticas e cdigo de mquina, em que o conhecimento dedetalhes relativos arquitetura e organizao so fundamentais, so ditaslinguagensdebaixonvel. Identificaoediferenciaodoselementosdodomnio No contexto de compiladores, importante compreender o que os diferentestermosdodomniosignificam.Emboracumprindotarefasparecidas,oscompiladores,tradutores,montadoreseinterpretadoressoelementosdiferentes. Compiladores: traduzem programas codificados em linguagens dealto nvelparalinguagem debaixo nvel. (ex.: C > .EXE, Java > Bytecode ou C# > MSIL (MicrosoftIntermediateLanguage)) Tradutores: traduzem programas codificados em linguagens dealto nvelparalinguagemdealtonvel.(ex.:Portugus>InglsouC#>Java) Montadores:traduzemprogramascodificadosemlinguagensdebaixonvel(simblica)paralinguagemdebaixonvel.(ex.:Assembly>.EXE) Interpretadores:diferenciamsedosdemaisporrealizarematraduodocdigofonteetambmexecutlo.(ex.:Browser>HTML,Bash(Linux)>Scripts) Ferramentasdeapoio Tm por objetivo aumentar a produtividade no processo de desenvolvimento.Podemoscitarcomoexemplos: InterfacesIntegradasdeDesenvolvimento(IDEs):costumeiramenteoferecemdiversosrecursos, mas principalmente auxiliam no gerenciamento de arquivos relativos aoprojeto, permitem a execuo e depurao da aplicao sem que seja necessriodeixar o ambiente de desenvolvimento, o complemento de comandos e realce desintaxe. 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 outroselementos grficos; habitualmente permitem a insero e posicionamento decomponentesusandoomouse. OmodelodeAnliseeSnteseparaaconstruodecompiladores Este modelo se fundamenta em dividir o processo em duas grandes fases: a anlise,emqueocdigofonteserverificadoeummodelorepresentativodesuaestruturaesignificadosconstrudo;easntese,emqueocdigocorrespondentetraduoserefetivamenteproduzidodeacordo. Aanlise lxica(ouscanner) a primeira etapa do processo de compilao e suafuno varrer o cdigofonte, caractere por caractere, compondo os elementos quede fato formam o programa e que so chamados de tokens ou lexemas.Adicionalmente, elementos tais como espaos em branco, tabulaes, marcas deformatao de texto, comentrios ou qualquer outro que sejam irrelevantes aoprocessodecompilaosoeliminados.Destemodo,dizemosqueoanalisadorlxicoresponsvelportransformarofluxodecaracteresemumfluxodetokens. Garantida a produo de uma sequncia coerente de lexemas, precisamos aindaverificar a adequao da estrutura gramatical do programa. A prxima subfase aanlisesinttica,emquesebuscadeterminarseumasequnciadesmboloslxicos(cadeia) pode ser gerada pela gramtica que define a linguagem em questo. Essatarefaconsisteemconstruirarvoredederivaocorrespondente. Restaaindaverificarosignificadoouasemnticadoprograma,tarefaexecutadapelaltima etapa da anlise, a chamadaanlise semntica. de sua responsabilidadeverificar certos aspectos que no foram investigados anteriormente porimpossibilidade ou inadequao de propsito, tais como questes relativas a escopo,regrasdevisibilidadeecompatibilidadeentretipos. Umavezgarantidoqueocdigofontevlidoecoerente,podesepassaraoprocessode sntese. durante agerao de cdigoque efetivamente ocorre a produo docdigo equivalente ao programa original. Dado o nvel de dificuldade inerente diferenaentreosnveisdeabstrao,umaprimeiratentativapodeserrealizadaeseuprodutopassaporumafasedeotimizao,cujoobjetivomelhorarocdigogeradoeeliminarredundncias,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.Umadiscussotpicaentredesenvolvedoresapaixonadosadequealinguagemdeprogramaodesuaprefernciaamelhor.Umexemplodessesembatesocorreuemcertaocasio,quandoumdesenvolvedorJavaeumprogramadorCtrocavaminsultosarespeitodalinguagemprediletadooutro,dizendo: Cumaporcaria!Sequiserportarumaaplicao,vaiterquearrumarocdigofonteerecompilar...isso,senoderproblema! Java lento, pois uma linguagem interpretada. Nunca se compara com odesempenhodeumcdigocompilado! a)Emqueaspectososcomentriospodemserverdadeiros? Resp.: Compiladores traduzem o cdigofonte para uma linguagemalvo, especfica deuma plataforma. Deste modo, se quiser mudar para uma plataforma diferente, necessriorecompilarocdigofonteconsiderandoanovaarquitetura.Nesseprocesso,algumasbibliotecasespecficaspodemnotersidoportadasounohaverumaversosimilar que a substitua nesta nova plataforma, causando aborrecimentos ou atmesmoinviabilizandotodooprocesso. AlinguagemJavaumbomexemplodetcnicahbrida,poisoscdigosfontesescritosemJavasocompiladostendocomolinguagemalvoosbytecodesdamquinavirtual.Quando executados, os programas ento interpretados pela mquina virtual e, dessaforma, realizam um processo de traduo dos bytecodes do programa para asinstrues da plataforma utilizada naquele momento. certo que o tempo adicionalgasto com a interpretao no seria necessrio se o programa fosse compiladodiretamenteparaaplataformadedestino. b) De que forma, a linguagem preferida por cada um deles poderia ser consideradacomo melhor em relao caracterstica que o interlocutor apontava como umadeficincianalinguagemdeseudesafeto? Resp.:UmprogramaemJavasempreexecutadonamquinavirtual.Aportabilidadese d no pelo programa em si, mas pela mquina virtual, que quem interpreta osbytecodes nas instrues especficas daquela plataforma. Portanto, supostamenteondehouverumaversodamquinavirtualimplementadapossvelexecutaraquelemesmoprogramasemterquecompillonovamente. O fato de um programa ser compilado uma nica vez permite que seja executadoinmerasvezessemquenenhumprocessodetraduoacontea.Masseemtodasasvezes que for executado tiver de passar por mais uma etapa, a de interpretao, certoqueconsumiralgumtemponestatarefaadicional. 2.Conceituecadaumdoselementosdadosaseguir: a)Linguagemfonteeobjeto; Resp.:Linguagemfontealinguagemusadaparaescreverprogramasquesoentradadeprocessadores de linguagens. Linguagemobjeto a linguagem usada paraescreverprogramasquesosadadeprocessadoresdelinguagens. b)Linguagemdealtonveledebaixonvel; Resp.: Linguagem de alto nvel a linguagem mais prxima da linguagem natural, eapresenta como principais caractersticas portabilidade, segurana, legibilidade e usode abstraes. Linguagem de baixo nvel a linguagem mais prxima do hardware, eapresenta como principais caractersticas dependncia da arquitetura, baixalegibilidade,baixaseguranaepoucoounenhumsuporteparaousodeabstraes. c)Linguagemdemontagemedemquina; Resp.: Linguagem de montagem e linguagem de mquina so ambas linguagens debaixo nvel, e por isso compartilham praticamente as mesmas caractersticas. A nicadiferena que alinguagem de montagem utiliza mnemnicos para melhorar umpouco a legibilidade dos programas, ao passo que a linguagem de mquina utilizaapenasoscdigosnumricos,quesointerpretadospelamquinaalvodiretamente. d)Discorrasobreasrelaesqueexistementretodosessestiposdelinguagens. Resp.: Linguagensfonte e linguagensobjeto podem ser tanto dealto quanto de baixonvel.Conformeaparticularcombinao,nomeiaseoprocessadordelinguagenscomocompilador, tradutor, filtro, montador etc. Linguagens de alto nvel e de baixo nvelpodem sertanto linguagensfonte quanto linguagensobjeto, dependendo de serem,respectivamente,entradaousadadeprocessadoresdelinguagens. AnliseLxica Antes de tentar converter o algoritmo em cdigo de mquina, devese analisar ocdigofonte para que seja possvel identificar os elementos que o compem eassegurarqueestejacorreto,tantoemtermosestruturaisquantosemanticamente. Cabe ao analisador lxico separar e identificar os elementos vlidos que compem oprogramafonte, atravs do processamento individual dos caracteres do arquivo deentrada.Competelheaindaatarefadeeliminaroschamadoselementosdecorativos"do programa, isto , caracteres tais como espaos em branco, marcas de formataodetextoecomentrios. Isso significa que, concluda a anlise lxica, os elementos utilizados para a escrita doprograma, tais como identificadores, operadores, delimitadores e palavras reservadasterosidoreconhecidoseidentificados. Tarefasquelhesopertinentes: Esquadrinharocdigofonte,smboloasmbolo,compondotokenseclassificandoos(segundoseusignificadoparaalinguagem); ComporegerenciarachamadaListadeTokens,umarelaodetodososelementosidentificadospeloscanningemumalistalinear; Eliminar elementos desnecessrios ao processo de compilao, tais comocomentriosesmbolosdecorativos; Reconhecerevalidarsequnciasnumricas,quersejaminteiros,reaisououtrabasesuportadapelalinguagem(e.g.hexadecimal); Reconhecer e validar elementos de definio pelo programador e utilizados comoidentificadores; Proverummecanismoparacontroledeerrosamigvel,hajavistaqueoanalisadorlxico quem varre o cdigofonte e, portanto, o nico que tem referncia dalocalidadeem que um determinado token ocorre (e.g.: mensagem deerro relativa aoelementoEdalinhaN). Comofazlo? Os tokens possuem uma estrutura sinttica, e deste modo podemos descrever cadaum dos itens da linguagem (palavras reservadas, operadores, delimitadores etc.)atravsderegrasdeproduo,taiscomo: identif=letra{letra|dgito} nmero=dgito{dgito} if="i""f igual="=""= Pensandonisso,inevitavelmentesurgeapergunta:Porqueoanalisadorlxiconoumapartedoanalisadorsinttico? Observealgunsaspectosquejustificamessadivisodefases: 1. Isso deixaria o analisador sinttico mais complicado de ser construdo, a citar adificuldade para distinguir palavras reservadas e identificadores. Porexemplo, umaregrasintticaquepoderiaserescritaassim: Statement::=ident"="Expr";"| "if""("Expr")"... Precisaria ser reescrita desta forma, para que fosse possvel tratar as duas tarefassimultaneamente: 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. Tokens podem ser descritos por gramticas regulares, que so mais simples e maiseficientes que as gramticas livres de contexto. A maioria das estruturas lxicas soregulares: Nomes::=letra{letra|dgito} Nmeros::=dgito{dgito} Strings::="\""{qqCaractereExcetoAspas}"\"" Palavrasreservadas::=letra{letra} Operadores::=>|=|+|... 4. Gramticas regulares no podem lidar com estruturas aninhadas, pois no socapazes de manipular recurso central. Esse tipo de construo importante namaioriadaslinguagensdeprogramao. ExpressesaninhadasExpr..."("Expr")"... ComandosaninhadosComando"do"Comando"while""("Expr")" ClassesaninhadasClasse"class""{"...Classe..."}" Osautmatosfinitospodemreconhecerlinguagensregulares.Assim,podemosdefiniroscannercomoumAFDquereconheaoselementosdalinguagemfonte. Oprocessamentodecadacaractereobtidoserregidopelastransiesprevistaspeloautmato,demodoqueoAFDterreconhecidoumasentena: Seaentradativersidoconsumidatotalmente;ou Se no for possvel realizar uma transio com o prximo smbolo da entrada e oautmatoencontrarseemumestadofinal. 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 aoprocesso de compilao, tais como espaos em branco e quebras de linha, dentreoutros. Se os espaos em branco so necessrios para que se possa separar umapalavradeoutra,entodequemodosoconsideradosdesnecessrios? Resp.: Apenas um caractere de espao necessrio para separar uma palavra deoutra,entoocorrnciasconsecutivassodesnecessriasparaessepropsito.Masat mesmo este nico espao perde sua utilidade aps a identificao do trminodo token em formao e, consequentemente, tambm pode ser descartado apscumprircomoseupropsito. AnliseSinttica(Introduo)Visogeraldoprocesso Tendoafunodeverificarseasconstruesutilizadasnocdigofonteestonaformaapropriada,aanlisesintticatemaresponsabilidadede: DadaumagramticalivredecontextoGeumasentenas,aquirepresentadapeloprogramafonte,oanalisadorsintticotemopropsitodeverificarsespertencelinguagemgeradaporG.Emoutraspalavras,apartirdostokensfornecidospeloanalisadorlxico,tentarconstruirarvoredederivaoparassegundoasregrasdeproduodadaspelagramticaG.Seestatarefaforpossvel,oprogramaconsideradosintaticamentecorreto. Tarefasquelhesopertinentes: >Comprovarqueasequnciadetokenscumpreasregrasgramaticais;e >Gerararvoregramaticaldoprograma. Assim,entendemosquesodesuacompetncia: Aidentificaodeerrosdesintaxe,porexemplo:A*/B; Acorretainterpretaodaestruturahierrquicaeaevoluodasentena,mesmoquandosobaspectosimplcitos.(ex.:A/B*Cserentendidacomo(A/B)*CemFortraneA/(B*C)emAPL); A capacidade de tratamento e/ou recuperao de erros de sintaxe. Vale ressaltar,emrelaoaesseaspecto,oprojetodeoferecerrecursossuficientes;mastambmtenha o cuidado de no retardar de forma significativa o processamento deprogramascorretos. H claras vantagens na utilizao de gramticas para especificar linguagens deprogramaoeprojetarcompiladores,acitar: Especificaessintticasprecisasdelinguagens; Possibilidadedeusodeferramentasparaageraoautomticadoparser; Possibilidade de identificar ambiguidades durante o processo deespecificao/construo; Facilidadesparaampliaroumodificaralinguagem. Tratamento/Recuperaodeerros Em geral, programas contm erros. Assim, um bom compilador deve, na medida dopossvel, detectar todos os erros ocorridos, avisar o usurio de suas ocorrncias erecuperarsedeles,demodoquesejapossvelanalisarorestantedocdigofonte. Aimplementaodeumbommecanismodedetecoerecuperaodeerrosmuitasvezesdependedaquestoserconsideradadesdeoinciodoprojetodalinguagem. Modopnicooudesespero Param imediatamente diante do primeiro erro ou, identificado um erro, oanalisador sinttico descarta smbolos de entrada, at que seja encontrado umtoken pertencente ao subconjunto de tokens de sincronizao (e.g.: ponto evrgula,delimitadoresetc.). Recuperaodefrases Ao descobrir um erro, o analisador sinttico pode tentar uma recuperaorealizando uma correo local na entrada restante, substituindoa por algumacadeia que permita que a anlise prossiga. Por exemplo, substituir uma vrgulainadequadaporumpontoevrgula,ouaindaremoverum:excedente. Produesdeerro Modificar a gramtica incluindo regras de produo estratgicas, de modo aacomodar os erros mais comuns. Assim, sempre que uma produo de erro foridentificada pelo analisador, possvel conduzir o tratamento mais adequadoquelasituaoemespecial. Correoglobal Emgeral,empregaalgoritmosqueescolhem,entrepossveissolues,aquelaqueapresentaumasequnciamnimademudanasparaqueseobtenhaumacorreoglobaldoprogramaenodoserrosindividualmente. Alguns dados interessantes que devem ser considerados quando se pensa em quoeficiente deve ser o mtodo de tratamento e recuperao de erros versus o tempodemandadoparaqueoperedemodosatisfatrio: Cerca de 60% dos programas so compilados de modo correto sinttica esemanticamente. Dentre os que apresentam erros: cerca de 80% dos enunciadosapresentam apenas um erro e 13% apresentam apenas dois erros. Emaproximadamente90%doscasos,oserrosenvolvemumnicotoken. Anlisesintticadescendenteeascendente Osmtodosdeanlisesintticapodemserclassificadossegundoamaneirapelaqualarvoredederivaodacadeiaanalisadaxconstruda: Nosmtodosdescendentes,arvoredederivaocorrespondenteaxconstrudade cima para baixo, ou seja, da raiz (o smbolo inicial S) para as folhas, onde seencontrax. Nosmtodosascendentes,arvoredederivaocorrespondenteaxconstrudade baixo para cima, ou seja, das folhas, onde se encontra x, para a raiz, onde seencontraosmboloinicialS. Nos mtodos descendentes (topdown), temos de decidir qual a regra A a seraplicadaaumnrotuladoporumnoterminalA.AexpansodeAfeitacriandonsfilhosrotuladoscomossmbolosde. Nos mtodos ascendentes (bottomup), temos de decidir quando a regra Adeveser aplicada, e devemos encontrar ns vizinhos rotulados com os smbolos de. AreduopelaregraAconsisteemacrescentarrvoreumnA,cujosfilhossoosnscorrespondentesaossmbolosde. Mtodosdescendenteseascendentesconstroemarvoredaesquerdaparaadireita.Arazoparaissoqueaescolhadasregrasdevesebasearnacadeiaasergerada,quelidadaesquerdaparaadireita.(Seriamuitoestranhoumcompiladorquecomeasseapartirdofimdoprogramaemdireoaoincio). 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 nasequnciaespecificadaconformedadonafiguraabaixo: Notequeasregrassoconsideradasnaordem12463466,amesmaordememqueas regras so usadas na derivaoesquerda:EE+TT+Ta+Ta+T*Fa+F*Fa+a*Fa+a*a Porm, se usarmos um mtodo de anlise ascendente, as regras so identificadas naordem64264631,eospassosdeconstruodarvorepodemservistosnafiguraaseguir: Embora a rvore de derivao seja usada para descrever os mtodos de anlise, naprtica ela nunca efetivamente construda. s vezes, se necessrio, construmosrvoressintticas,queguardamalgumasemelhanacomarvoredederivao,masocupamumespaodememriasignificativamentemenor.Anicaestruturadedadosnecessria para o processo de anlise uma pilha, que guarda informao sobre osnsdarvoredederivaorelevantesemcadafasedoprocesso. Nocasodaanlisedescendente,osnsrelevantessoaquelesaindanoexpandidos;nocasodaanliseascendente,soasrazesdasrvoresqueaindanoforamreunidasemrvoresmaiores. TiposdeAnalisadoresSintticos: MtodosdeCockeYoungerKasamieEarly o universais:servemparaqualquergramtica(bemeficientes). Mtodos descendentes (topdown): constroem a rvore sinttica de cima parabaixo o AnalisadoresDescendentesRecursivos o AnalisadoresLL(k) Mtodos ascendentes (bottomup): constroem a rvore sinttica de baixo paracima 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.:Aanlisedeterminsticaaquelaemquetodasasdecisesdemovimentaodoreconhecedor so tomadas "sem arrependimento". Se no houver movimentaopossvel, isso indica a ocorrncia de um erro na cadeia de entrada. A anlisenodeterminstica, por outro lado, opera por tentativa e erro. Erros na cadeia deentrada so apontados apenas depois de esgotadas todas as possibilidades demovimentao.A anlise descentente, tambm conhecida como topdown, aquela em que oreconhecedoriniciaosseusmovimentosnaraizdagramticaeevoluiatacadeiadeentrada (em termos de rvore, aquela em que a rvore montada de cima parabaixo). A anlise ascendente, ou bottomup, aquela em que os movimentos doreconhecedor vo da cadeia entrada em direo raiz da gramtica (a rvore montadadebaixoparacima).Uma Gramtica LL(1) aquela quegera uma linguagem que pode serreconhecida daesquerda para a direita, usando derivaes mais esquerda e com lookahead deapenas um smbolo. Linguagem LL(1) aquela que pode ser gerada por algumagramtica LL(1). Gramtica LR(1) aquela que gera uma linguagem que pode serreconhecida da esquerda para a direita, usando redues mais esquerda e comlookaheaddeapenasumsmbolo.LinguagemLR(1)aquelaquepodesergeradaporalgumaGramticaLR(1).

2. Considere a gramtica abaixo, sobre o alfabeto ={(,),a,,}:L(S)SI,S|IIa|La)Mostreosmovimentosdeumreconhecedorascendentenaanlisedasentena (a,(a),(a,a)); b)Mostreosmovimentosdeumreconhecedordescendentenaanlisedasentena (a,(a),(a,a)); c)Obtenhaoesboodeumreconhecedorrecursivodescendenteparaalinguagemporeladefinida.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:Umreconhecedorrecursivoobtidotranscrevendocadaumadasregrasdeproduodagramticacomoumasubrotinaresponsvelporconsumirostokensdacadeiagerada.Semprequeencontrarmosumsmbolonoterminalnasentena,realizaseachamadasubrotinacorrespondente;e,quandoencontramosumsmboloterminalnaregra,verificamossecorrespondeaosmbolodadonaentrada(posiocorrentedeanlisedecdigofonte).Deacordocomessesconceitos,poderamosteroseguintecdigoparaestagramtica:voidparseL(){voidparseS(){voidparseI(){ accept("(");parseI();switchs{ parseS();whiles==","{case"a":acceptIt(); accept(")");acceptIt();break(); }parseI();case"(":parseS(); }break; }defaul:ERRO(); } } AnliseSintticaIAnliseDescendenteArepresentaodoprocessoserfeitaatravsdeconfiguraes(,y),emqueeyrepresentam, respectivamente, o contedo da pilha e orestoda entrada ainda noanalisada.Porconveno,vamossuporqueotopodapilhaficaesquerda,isto,queoprimeirosmbolodeosmbolodotopodapilha.Existemduasformasdetransiodeumaconfiguraoparaoutra:(1)expansodeumnoterminalpelaregraA:permitepassardaconfigurao(A,y)paraaconfigurao(,y).(2)verificao de um terminal s: permite passar da configurao (s, sy) para aconfigurao(,y).Osegundotipodetransioservepararetirarterminaisdotopodapilhaeneleexporoprximonoterminalaserexpandido.Aconfiguraoinicialparaaentradax(S,x);o processo termina na configurao (,), com a pilha vazia, e a entrada todaconsiderada.Exemplo:Mostramos abaixo as configuraes sucessivas de um analisadordescendente, para a cadeiax. Para acompanhamento, a terceira coluna apresenta ospassos correspondentes da derivao esquerda de x. Note que apenas os passos deexpansotmcorrespondentenaderivao.Pilha (topoesquerda) (restanteda) Entrada Derivaoesquerda (leftmost) Ea+a*aE E+Ta+a*a E+T T+Ta+a*a T+T F+Ta+a*a F+T a+Ta+a*a a+T +T+a*a Ta*a T*Fa*a a+T*F F*Fa*a a+F*F A*Fa*a a+a*F *F*a Fa aa a+a*a AnliseSintticaLL(1)Nestemtodo,aescolhadaregraaserusadaduranteoprocessodeanlisedescendentesedatravsdeduasinformaes:onoterminalAaserexpandidoeoprimeirosmboloadorestodaentrada.UmatabelaMindexadaporestasduasentradasnosfornecearegraaserutilizada:M[A,a].Valeressaltarqueessatcnicaspodeserempregadaparaumaclasserestritadegramticas,aschamadasgramticasLL(1).OnomeLL(1)indicaque: Acadeiadeentradaexaminadadaesquerdaparaadireita(L=lefttoright); Oanalisadorprocuraconstruirumaderivaoesquerda(L=leftmost); Exatamente1smbolodorestodaentradaexaminado.ExemploSuponhaagramticaaseguir:1.ETE' 2.TFT' 3.F(E) 4.Fa 5.E'+TE' 6.E' 7.T'*FT' 8.T' EssagramticaLL(1)e,assim,asuatabeladeanliseMser:(a+*)$ E11 T22 F34 E'566 T'8788 Nessatabela,aentradaM[S,k]correspondenteaonoterminalSeaoterminalktemonmerodaregraquedeveserusadaparaexpansodeS.Asentradasindicadaspor""correspondemaerros,ouseja,socombinaesquenopodemocorrerduranteaanlisedecadeiasdalinguagem.Paraanalisaracadeiaa+a*a,teremosasseguintesconfiguraes:PilhaEntradaEscolhadaregra Ea+a*aM[E,a]=1 TE'a+a*aM[T,a]=2 FT'E'a+a*aM[F,a]=4 aT'E'a+a*a T'E'+a*aM[T',+]=8 E'+a*aM[E',+]=5 +TE'+a*a TE'a*aM[T,a]=2 FT'E'a*aM[F,a]=4 aT'E'a*a T'E'*aM[T',*]=7 *FT'E'*a FT'E'aM[F,a]=4 aT'E'a T'E'M[T',$]=8 E'M[E',$]=6 Vamos,agora,mostrarcomoconstruirM,atabeladeanliseLL(1).Nocasomaissimples,osmboloa(oprimeirodorestodaentrada)oprimeirosmboloderivadodonoterminalaserexpandidoA,efazpartedeFirst(A).Nestecaso,adevepertenceraFirst(),emqueAumadasalternativasderegraparaA.Comoilustrao,podemosverque,noexemploacima,aregraF(E)foiusadacomosmbolo(.OutrapossibilidadeadequenosejaAonoterminalresponsvelpelageraodosmboloa,massimalgumoutronoterminalencontradodepoisdeA.Nestecaso,devemosterapertencendoaoFollow(A).Comoilustrao,podemosverque,noexemploacima,aregraT'foiusadacomosmbolo+.ParaconstruiratabelaM,vamosexaminartodasasregrasdagramtica: Paracadaregrai:A,temosM[A,a]=i,paracadaaemFirst(). Paracadaregrai:A,se*,temosM[A,a]=i,paracadaaemFollow(A).SeagramticaLL(1),cadaentradadeMrecebernomximoumvalor.AsentradasdeMquenoreceberemnenhumvalordevemsermarcadascomoentradasdeerro.CasoalgumaentradadeMsejadefinidamaisdeumavez,dizemosquehouveumconflito,equeagramticanoLL(1).ExemploConsidereagramticadadanoexemploanterior.EssagramticaLL(1),eatabeladeanliseMpodeserconstrudacomoindicado.Temos,paracadaregra:1.ETE'First(TE')={(,a}M[E,(]=1eM[E,a]=1 2.TFT'First(FT')={(,a}M[T,(]=2eM[T,a]=2 3.F(E)First((E))={(}M[F,(]=3 4.FaFirst(a)={a}M[F,a]=4 5.E'+TE'First(+TE')={+}M[E',+]=5 6.E'Follow(E')={$,)}M[E',$]=6eM[E',)]=6 7.T'*FT'First(*FT')={*}M[T',*]=7 8.T'Follow(T')={$,+,)}M[T',$]=8,M[T',+]=8eM[T',)]=8 ExemploConsidereagramticadadaabaixo,esquerda.Teremos:1.EE+TFirst(E+T)={(,a}M[E,(]=1eM[E,a]=1 2.ETFirst(T)={(,a}M[E,(]=2eM[E,a]=2 3.TT*FFirst(T?F)={(,a}M[T,(]=3eM[T,a]=3 4.TFFirst(F)={(,a}M[T,(]=4eM[T,a]=4 5.F(E)First((E))={(}M[F,(]=5 6.FaFirst(a)={a}M[F,a]=6 Consequentemente,agramticanoLL(1),porcausadosconflitos(mltiplasdefinies)paraM[E,(],M[E,a],M[T,(]eM[T,a].Emalgunscasos,comoodagramticadoexemploanterior,possvelconcluirqueagramticanoLL(1)porinspeo.Asduascaractersticasmaisbviasso:arecursoesquerdaeapossibilidadedefatorao.Recursoesquerda:SeumagramticapermiteumaderivaoA*A,paraalgumnoterminalAeparaalgumacadeianovazia,agramticaditarecursivaesquerda.Nocasomaissimples,existenagramticaumaregraAAresponsveldiretamentepeladerivaomencionada.ParaqueAnosejaumnoterminalintil,deveexistirnagramtica(pelomenos)umaregradaformaA,semrecursoesquerda.AcombinaodessasduasregrasfazcomqueFirst(A)e,portanto,First(A)contenhamtodosossmbolosdeFirst(),eissolevanecessariamenteaumconflito.Aeliminaodarecursoesquerdapodesertentada,procurandotransformaragramticaemumagramticaLL(1).Observarqueacombinao:AAAPermiteageraodecadeiasdaforma,equeessasmesmascadeiaspodemsergeradasdeoutramaneira.Porexemplo:AA'A'A'A'Estaoutraformadegeraousarecursodireita,quenocriaproblemas.PrefixoscomunsTratasedocasoemqueduasregrascomeamcomomesmosmboloouconjuntodesmbolos(prefixo),isto,regrascomoAeA,comFirst().Nestecaso,existeumainterseoentreFirst()eFirst(),eagramticanopodeserLL(1).Istoaconteceporquenopossveldecidir,olhandoapenasoprimeirosmboloderivadode,qualaregracorreta.Asoluosimpleseenvolveafatorao.Suponhaasregrasabaixo:AAPodemosreescreveressasregrasemequivalentes,demodoacolocaroprefixoemumaregraeadiaradecisoentreeparaquandooprimeirosmboloderivadodeoudeestivervisvel.AA'A'A'EstasduastcnicaspermitemtransformaralgumasgramticasemgramticasLL(1).Entretanto,valeressaltarquealgumasgramticaslivresdecontextoGLCnotmgramticasequivalentesLL(1).Nessecaso,aaplicaodessastcnicasoumesmodeoutraspodernotersucesso.ExemploConsidereagramticaaseguir:1.EE+T|T2.TT*F|F3.F(E)|aEstagramticaapresentaduassituaesderecursoesquerda.Fazendoassubstituiesindicadas,temos:1.ETE'2.E'+TE'|3.TFT'4.T'*FT'|5.F(E)|aEestagramticaLL(1),comojfoivistoanteriormente.ExemploSuponhatransformaragramticaabaixoemumagramticaLL(1)equivalente:1.LL;S|S2.SifEthLelLfi|ifEthLfi|s3.EeTemosrecursoesquerdanasregrasdeL,epossibilidadedefatoraonasregrasdeS.UmatransformaodestagramticaemLL(1)teriaoseguinteresultado:1.LSL'2.L';SL'|3.SifEthLS'|s4.S'elLfi|fi5.EeNovamente,podemosverificarqueestaumagramticaLL(1).Leiturarecomendada:Captulo4,seo4.4dolivroCompiladores:princpios,tcnicaseferramentas(LivrodoDrago)Captulo 3, seo 3.2 do livro Implementao de linguagens de programao:compiladoresExercciosresolvidos:1.Considereagramticaabaixo:SaXb|aYc|aaZdXbX|bcYcY|cbZdZ|a)EssagramticaLL(1)?Proveasuaresposta.b)CasoagramticaacimanosejaLL(1),obtenhaumagramticaequivalentequesejaLL(1)eprovequeanovagramtica,defato,LL(1).Resp.itema:No,poisosconjuntosFirstnosodisjuntos.Emtodasasregrasencontramosprefixosiguaisparaaspossveisderivaesdecadaregra,querdemaneiradiretaouindireta.NotequeissoserefletediretamentenosvaloresincludosnosconjuntosFirsteFollow,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:EliminandorecursesefazendosubstituiesdossmbolosnasconstruesdadasporS,teremos:Sab*bcb|ac*cbc|aad*d.FatorandoastrsdiferentespossibilidadesdederivaoparaosmboloS,ficaramoscomaseguinteregra:Sa(b*bcb|c*cbc|ad*d)possvelobservarqueessagramticanoapresentarecursesesquerda,umavezquederivadiretamentedesentenascompostasapenasdesmbolosterminais.Almdisso,tambmnotasequeosprefixosparacadaumadaspossveisderivaesapsoprimeirosmboloasodiferentesparaostrscasospossveis.EstesaspectospodemserconfirmadosquandocalculamososconjutosFirstparacadaumadastrspossibilidadesdederivaoapresentadasparaosmboloS: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 a essa linguagem:123,45.312,+.76,5.44e2,+0.88e35.Resp.:Um reconhecedor recursivo transcreve a regra de produo como uma subrotina responsvel por consumir um de seus tokens na ordem em que so dados.Semprequeencontrarmosumsmboloquepodeounoocorrernasentena,devemosterocuidadoparanoreportarumerroindevidamente.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(); }