Conteúdo da aula 1. xemplos de Gramáticas Revisão de GLC e Analisadores Descendentes Marcelo Johann 2. Propriedades: Ambíguas, sem ciclos, ε-livres, fatoradas à esquerda, recursivas à esquerda, simplificadas 3. Transformações: liminação de produções vazias, de recursividade à esquerda (direta, indireta), fatoração 4. Analisadores Descendentes Recursivos com Retrocesso Recursivos Preditivos Conjunto FIRST e Implementação INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 2 xemplos Gramática para Comandos xemplos Gramática para xpressões cmd if expr then cmd else cmd print expr ( bool ) expr && expr expr expr bool true false OP ( ) x OP * / + - INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 3 INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 4 xemplos Gramática para Listas S a [ L ] L S ; L S Convenções Ressaltando Símbolos que representam terminais em minúsculos: u, v, x, y,... Símbolos que representam não-terminais em maiúsculos: X, Y, TRM, S,... Símbolos que representam formas sentenciais (seqüências de terminais e não-terminais): letras gregas ou sublinhadas: α, β, ω, w, z Outras INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 5 INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 6 1
Derivações Derivação em um passo A xy Derivação em múltiplos passos Se A w 2 w 3 w n dizemos que A * w n Tipos e Características Gramáticas Ambíguas Gramáticas sem ciclos Gramáticas ε-livres Gramáticas fatoradas à esquerda Gramáticas recursivas à esquerda Gramáticas simplificadas INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 7 INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 8 Gramática Ambígua Considere 5 3 * 2 OP ( ) x OP * / + - Gramática sem ciclos: Uma gramática sem ciclos é uma GLC que não possui derivações da forma A + A para algum A N 5 - * 3 2 5 3 - * 2 Gramática ε-livre : GLC que não possui produções vazias do tipo A ε exceto a produção S ε (S é o símbolo inicial). INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 9 INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 10 Transformações de GLCs Gramática fatorada à esquerda: GLC que não possui produções do tipo A αβ 1 αβ 2 para alguma forma sentencial α. Gramática recursiva à esquerda: GLC que permite a derivação A + Aα para algum A N O não terminal A deriva ele mesmo, de forma direta ou indireta, como símbolo mais à esquerda de uma subpalavra gerada. (A) liminação de produções vazias (B) liminação de recursividade à esquerda: recursão direta recursão indireta (C) Fatoração de uma gramática INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 11 INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 12 2
liminação de Produções Vazias liminação de Produções Vazias INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 13 INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 14 liminação de Produções Vazias (B) liminação de recursividade à esquerda xemplo de GLC recursiva à esquerda: A Aa b Gramáticas transformadas equivalentes: Com a palavra vazia A bx X ax ε Sem a palavra vazia A b bx X a ax Obs: pode ainda haver recursão indireta! INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 15 INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 16 (B) Outro exemplo de recursividade -> +T T T -> T*F F F -> () Id A regra -> +T T se torna: -> T -> +T ε A regra T- > T*F F se torna: T -> FT T -> *FT ε (C) Fatoração de uma gramática limina a indecisão de qual produção aplicar quando duas ou mais produções iniciam com a mesma forma sentencial A αβ 1 αβ 2 Se torna: A αx X β 1 β 2 INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 17 INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 18 3
(C) xemplo de Fatoração a squerda Análise top-down e bottom-up Cmd if xpr then Cmd else Cmd Cmd if xpr then Cmd Cmd Outro Fatorando a esquerda: Cmd if xpr then Cmd lseopc Cmd Outro lseopc else Cmd ε INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 19 INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 20 Analisadores Descendentes Também chamados recursivos ou top-down Recursivos com Retrocesso Testam cada possível derivação xemplo Recursivos Preditivos Determinam produção pelo símbolo terminal atual xemplo Conjunto FIRST e método de encontrá-lo Implementação xemplo Gramática para Listas S a [ L ] L S ; L S ntrada: [ a ] $ INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 21 INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 22 S A B A c ε Top-Down: Backtracking B cbb ca Gera S * cbca? S cbca tentar S AB AB cbca tentar A c cb cbca casar c B bca sem-saída, tentar A ε εb cbca tentar B cbb cbb cbca casar c bb bca casar b B ca tentar B cbb cbb ca casar c bb a sem-saída, tentar B ca ca ca casar c a a casar a -> Fim! Observações sobre o método recursivo com retrocesso É fácil de implementar. É necessário: 1. Que a gramática não seja recursiva à esquerda A Aa se tornará ReconheceA() { ReconheceA();... } Recursão infinita! INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 23 INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 24 4
Analisadores Descendentes Também chamados recursivos ou top-down Recursivos com Retrocesso Testam cada possível derivação xemplo Recursivos Preditivos Determinam produção pelo símbolo terminal atual xemplo Conjunto FIRST e método de encontrá-lo Implementação xemplo Gramática onde é fácil distinguir produções CMD if XPR then CMD CMD while XPR do CMD CMD repeat LISTA until XPR CMD ID := XPR INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 25 INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 26 xemplo Mesma Gramática com mais Não-Terminais CMD COND ITR ATRIB COND if XPR then CMD ITR while XPR do CMD repeat LISTA until XPR ATRIB ID := XPR INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 27 xemplo Outra Gramática CMD: IF ASS WHIL BL; BL: { CMDL } ; CMDL: CMD RSTO; RSTO: ; CMDL epsilon; IF: "if" "then" CMD; WHIL: "while" "do" CMD; ASS: L = ; L: * ; : NUM ID; INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 28 Definição: Conjuntos First Seja α qualquer seqüência de símbolos terminais ou não terminais First(α): Definição informal: conjunto de todos os terminais que começam qualquer seqüência derivável de α. Definição formal: Se existe um t T e um β V* tal que α * t β então t First(α) Se α * ε então ε First(α) A B C D B b C c D d First(A)={b,c,d} First(B)={b} First(C)={c} First(D)={d} INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 29 Condição para que se possa usar um analisador preditivo Informalmente: no caso que em os First() dos lados direitos das regras de produção sejam simpáticos, não terá retrocesso. Formalmente: para qualquer produção A α 1 α 2... α n, quer-se: First(α 1 ) First(α 2 )... First(α n ) = Ø INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 30 5
Repeat { proc First(α: string of symbols) Para todas as produções α X 1 X 2 X 3 X n do if X 1 T then // caso simples onde X 1 é um terminal First(α) := First(α) {X 1 } else { // caso menos simples: X 1 é um não-terminal First(α) = First(α) First{X 1 } \ {ε}; for (i=1 ; i<=n ; i++) { if ε is in First(X 1 ) and in First(X 2 ) and in First(X i-1 ) First(α) := First(α) First(X i ) \ {ε} } } if (α =>* ε) then First(α) := First(α) {ε} end do } until no change in any First(α) INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 31 Observações sobre o método recursivo preditivo É fácil de implementar. É necessário: 1. Que a gramática não seja recursiva à esquerda A Aa se tornará ReconheceA() { ReconheceA();... } Recursão infinita! 2. Que a gramática seja fatorada à esquerda Senão, há ambigüidade na escolha da derivação. 3. Que os primeiros terminais deriváveis possibilitem a decisão de uma produção a aplicar! Não há retrocesso sobre não-terminais... INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 32 Implementação CMD: IF ASS WHIL BL; BL: '{' CMDL '}'; CMDL: CMD RSTO; RSTO: ';' CMDL; IF: "if" "then" CMD; WHIL: "while" "do" CMD; ASS: L '=' ; L: '*' ; : NUM ID; INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 33 tapas voltando ao yacc INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 34 Leituras e Tarefas sugeridas Ler e Reler o Livro Implementar outra GLC Ligar sua implementação com yylex Ligar com autômato INF01033 - Compiladores B - Marcelo Johann - 2012/1 Aula 07 : Slide 35 6