CC Leandro 03-08 SEI Uni I (RF)Bb(1)

39
Unidade I COMPILADORES E COMPUTABILIDADE COMPUTABILIDADE Prof. Leandro Fernandes

description

UNIP

Transcript of CC Leandro 03-08 SEI Uni I (RF)Bb(1)

Unidade ICOMPILADORES E COMPUTABILIDADE COMPUTABILIDADEProf. Leandro FernandesRoteiro Contextualizao e conceitos bsicos O que acontece desde a codificao at a execuo de um programa? O modelo de anlise e sntese Anlise lxica a 1 etapa! Anlise lxica, a 1 etapa! O emprego das gramticas regulares e autmatos finitos O processo de anlise sinttica. Tipos de analisadorespe recuperao de erros Analisadores descendentes. Descendentes recursivos e LL(1)Linguagens, ferramentas e tradutores Visual Studio Eclipse Netbeans Assembly Java HTML PHP C/C++LinguagemFerramenta de ApoioInterpre-tadorCompiladorTradutorMontador gcc javac masm JVM dot NET BrowserDa codificao a execuoCdigo fontePr-processadorCdigo fonte sem macrosCompiladorCdigo em Linguagem de Montador CompiladorMontagemMontadorCdigo objetoLinker(Ligador)Cdigo de mquina realocvelLoader - SO (Carregador)Cdigo de mquina absolutoEstrutura dinmica de um compiladorEstrutura dinmica de um compilador (cont.)^Compiladores vs. interpretadoresCompiladores vs. interpretadoresCompiladores de duas passagens(modelo de anlise e sntese)^Interatividade Qual tipo de software tradutor deve ser utilizado para programas em geral, quando a velocidade de execuo uma exigncia de alta prioridade?a) Compiladores.b) Interpretadores.c) Tradutores hbridos.d) Macroprocessadores.e) Interpretadores de macroinstrues.Analise lxica(tokenizao ou scanning) Produzir smbolos terminais: Ignorar e descartar smbolos irrelevantes: espaos em branco; espaos em branco; caracteres de tabulao; caracteres de controle (CR e LF); Comentrios. Tokens possuem uma estrutura sinttica:id tif l t { l t | d it } identif:= letra { letra | dgito } nmero:= dgito { dgito } if := i f igual := " = =...Por que o analisador lxico no uma parte do analisador sinttico? Isso deixaria o analisador sinttico mais complicado de ser construdo. Dificulta a distino entre palavras reservadas e identificadores. Precisaria ser reescrito na forma:Por que o analisador lxico no uma parte do analisador sinttico? O scanning deve eliminar brancos, tabulaes, fins de linha e comentrios. Esses caracteres podem ocorrer em qualquer lugar do cdigo, levando a gramticas muito complexas. Tokens podem ser descritos por linguagens regulares: mais simples e mais eficientes que as gramticas livres de contexto.Usando uma gramtica regular para representar lexemas Um gramtica dita regular se suas produes so na forma: Ex : gramtica de nomes Ex.: gramtica de nomes. Definio alternativa:O scanner como um AFD (Autmato Finito Determinstico) Exemplo para a entrada:max >= 30Portanto, a anlise lxica dever: esquadrinhar o cdigo fonte, smbolo a smbolo, compondo tokens, e classific-los; eliminar elementos desnecessrios ao processo de compilao;reconhecer e validar reconhecer e validar nmeros inteiros e reais; reconhecer e validar os elementos utilizados como identificadores; prover recursos para que se projete um mecanismo de controle um mecanismo de controle de erros mais amigvel; interagir com o sistema de arquivos.Interatividade Dentre os diferentes tipos de mensagens de erro que podem ser reportados por um compilador, quais dentre as apresentadas abaixo so de natureza lxica?a) Identificador no declarado.b) Esperado fim de comentrio.c) Esperado smbolo X, porm encontrado smbolo Y.d) Nmero de parmetros insuficiente (durante a chamada de uma sub rotina) (durante a chamada de uma sub-rotina).e) Tipo misturado (durante uma atribuio).Anlise sinttica:2 etapa do processo de anliseAnalisadorAnalisadorAnalisador Sinttico rvoreAnalisador Lxico Tokens rvore sinttica Tabela de smbolos TokensA anlise sinttica deve: Comprovar que a sequncia de tokenscumpre as regras sintticas da linguagem: identificar erros de sintaxe. Compor a estrutura hierrquica Compor a estrutura hierrquica dos comandos e expresses: A / B * C (A/B) * C em FortranA / (B*C) em APL Recuperao de erros de sintaxe. Importante: no retardar, de forma significativa, o processamento de programas corretos. Especificando a linguagem por meio de Gramticas Livres de Contexto Gramticas regulares no podem lidar com estruturas aninhadas ou com recurses centrais: Expr ... " ("Expr " )"... Cmd " do" Cmd " while" " (" Expr " ) Cmd doCmdwhile (Expr ) Soluo: Gramticas Livres de Contexto. Vantagens na utilizao de gramticas: especificaes sintticas; permite uso de geradores automticos; p g ; o processo de construo pode levar identificao de ambiguidades; facilidade em ampliar/modificar a linguagem.Tipos de analisadores sintticos Mtodos descendentes (Top Down): Constroem a rvore sinttica de cima para baixo (da raiz para as folhas), ou seja, do smbolo inicial da gramtica para a sentena: Analisadores descendentes recursivos; Analisadores descendentes recursivos; Analisadores LL(k).EE TT F TEE TTFTEE TTEE TT+ +E*+ * aFaFa + * aFaFa + * aFa a + * a a a + * a a aTipos de analisadores sintticos Mtodos ascendentes (Bottom-up): Constroem a rvore sinttica de baixo para cima (das folhas para a raiz), ou seja, reduz os smbolo da sentena at alcanar o smbolo inicial da gramtica: Analisadores LR; Analisadores LALR.EE T E T E E E+TT*FaFTaFaE+TT*FaFTaFaE+T*FaFTaFaE+ * aFTaFa + * aFa aTipos de analisadores sintticos Tanto em analisadores ascendentes quanto descendentes a entrada sempre examinada da esquerda para a direita, um smbolo por vez. Muitos compiladores so dirigidos pela sintaxe (parsen driver), isto , o analisador sinttico chama o analisador lxico. Ferramentas para gerao automtica de analisadores sintticos baseiam-se na gramtica. Ex.: Yacc, Bison e ANTLR.Recuperao de erros Modo Pnico ou Desespero: para imediatamente; ou descarta smbolos at que seja encontrado um tokende sincronizao. de sincronizao. Recuperao de frases: tenta realizar uma correo local, substituindo alguns elementos que permitam anlise prosseguir. Ex.: substituir uma vrgula inadequada por um ponto e vrgula, remover um :excedente.Recuperao de erros (cont.) Produes de erro: aumenta-se a gramtica, incluindo regras de forma a acomodar os erros mais comuns. Correo global: Correo global: um algoritmo escolhe a sequncia mnima de mudanas necessrias para se obter a correo. Ex.: dada uma cadeia x, o parserprocura rvores gramaticais que procura rvores gramaticais que permitam transformar x em y (cadeia correta) com um mnimo de modificaes.Interatividade Analise o texto:Na compilao, a anlise consiste em trs fases. Em uma das fases, os caracteres ou tokens so agrupados hierarquicamente em colees aninhadas com significado coletivo. Essa fase envolve o agrupamento dos tokens do programa envolve o agrupamento dos tokens do programa fonte em frases gramaticais, que so usadas pelo compilador, a fim de sintetizar a sada. Usualmente, as frases gramaticais do programa fonte so representadas por uma rvore gramatical. A fase citada no texto conhecida como anlise: a) sinttica.b) semntica.c) lxica. d) binria.e) linear.Anlise sinttica Tarefa: dada uma gramtica livre de contexto G e uma sentena s, o analisador sinttico deve verificar se s pertence linguagem gerada por G. O analisador tenta construir a rvore de derivao para s segundo as regras de produo dadas pela gramtica G. Se esta tarefa for possvel, o programa considerado sintaticamente correto. O analisador no precisa efetivamente construir a rvore, mas sim comprovarque possvel constru-la. Pode ser emulado utilizando-se uma pilha de dados.Anlise sinttica descendente:analisadores descendentes recursivos So construdos transcrevendo-se cada uma das regras de produo da gramtica como uma sub-rotina que ser responsvel por consumir os tokens da sentena.Assim, temos: para cada smbolo no terminal da regra, invocamos a sub-rotina correspondente; e para cada smbolo terminal da regra verificamos se ele ocorre na posio verificamos se ele ocorre na posio corrente da anlise.Anlise sinttica descendente:analisadores descendentes recursivosSuponha a gramtica abaixo:(1) L (S)(2) S I , S | I(3) I a | LvoidparseL(){accept("(");parseS();accept(")");(1)(3)}voidparseS(){parseI();whiles==","{acceptIt();voidparseI(){switchs{case"a":acceptIt();break();case"(":parseS();(2)(3)parseI();}}break;default:ERRO();}}Anlise sinttica descendente:analisadores LL(1)O nome LL(1) indica que: a cadeia de entrada examinada da esquerda para a direita (left-to-right); o analisador procura construir uma derivao esquerda (leftmost); uma derivao esquerda (leftmost); considera-se apenas o 1 smbolo do restante da entrada.Anlise sinttica descendente:analisadores LL(1) Temos de decidir qual regra A deve ser aplicada a um n rotulado por um no terminal A. A expanso de A feita criando ns filhos rotulados com os smbolos de . Considera duas informaes: o no terminal a ser expandido; e o smbolo corrente da entrada. Uma tabela M nos fornece a regra a ser utilizada com base nessas a ser utilizada com base nessas duas entradas. Essa tcnica s pode ser usada para a classe das gramticas LL(1).Analisador LL(1)Seja a gramtica:(1) E T E First(TE) = { (, a}(2) T F T First(FT) = { (, a}(3) F ( E ) First((E)) = { ( }(4) F a First(a) = { a }(5) E' + T E First(+TE) = { + }(6) E' Follow(E) = { ), $}(7) T' * F T First(*FT) = { * }T' F ll (T) { ) $} (8) T' Follow(T) = { +, ), $}Analisador LL(1)Seja a gramtica:(1) E T E First(TE) = { (, a}(2) T F T M[ E, ( ] = 1(3) F ( E ) M[ E, a ] = 1(4) F a(5) E' + T E(6) E' (7) T' * F TT' (8) T' Analisador LL(1)Seja a gramtica:(1) E T E(2) T F T(3) F ( E )(4) F a(5) E' + T E(6) E' Follow(E) = { ), $}(7) T' * F T M[ E, ) ] = 6T' M[ E $ ] 6 (8) T' M[ E, $ ] = 6Analisador LL(1)Seja a gramtica:(1) E T E(2) T F T'(3) F ( E )( a +*) $E 1 1 - - - -(3) F ( E )(4) F a(5) E' + T E(6) E' (7) T' * F TT 2 2 - - - -F 3 4 - - - -E' - - 5 - 6 6T' 8 7 8 8 (7) T* F T(8) T' T' - - 8 7 8 8Analisando a sentena: a+aPilha Entrada RegraE a+aM[E, a] = 1 E T ET E' a+a M[T, a] = 2 T F T 'F T 'E' a+a M[F, a] = 4 F aa T 'E' a+a Verifica aT 'E' +a M[T', +] = 8 T ' E' +a M[E', +] = 5 E' + T E+ T E' +a Verifica +T E' a M[T, a] = 2 T F T 'F T ' E' a M[F, a] = 4 F a [ ]a T ' E' a Verifica aT ' E' M[T', $] = 8 T ' E' M[E', $] = 6 E' -Identificando se uma gramtica LL(1)(1) E E + T First( E+T ) = { (, a }(2) E T First( T ) = { (, a }(3) T T * F(4) T F M[E, (] = 1 e M[E, a] = 1(5) F ( E ) M[E, (] = 2 e M[E, a] = 2 ( ) ( ) [ , (] [ , ](6) F a A gramtica dada acima no LL(1) por causa dos conflitos. Podemos descobrir por inspeo. As duas caractersticas mais bvias so: duas caractersticas mais bvias so: a possibilidade de fatorao; e a recurso esquerda.Interatividade Analise cada uma das afirmaes dadas a seguir e indique a que julgar incorreta.a) Os parsers top-down no tm problemas em relao a gramticas recursivas esquerda.b) Yacc gera parsers bottom-up, que so mais eficientes.c) Os parsers bottom-up so normalmente gerados por ferramentas.d) Parsers descendentes recursivos d) Parsers descendentes recursivos so um exemplo de parser top-down.e) relativamente fcil escrever um parsertop-down manualmente, usando funes recursivas.AT A PRXIMA!