Cpítulo 4 nálise intáctic Descendente Os utomátos finitos presentdos no cpítulo nterior são suficientes pr trtr os elementos léxicos de um lingugem de progrmção, o trtmento d estrutur sintáctic de um lingugem de progrmção está, em gerl, for do lcnce de tis métodos, sendo necessário construir reconhecedores pr lingugens independentes do contexto ms não necessrimente regulres Neste cpítulo vmos estudr um clsse de reconhecedores pr lingugens independentes do contexto, os reconhecedores descendentes, sendo que no próximo cpítulo trtr-se-á dos reconhecedores scendentes 41 Reconhecimento Descendente de Lingugens Não-Regulres Um reconhecedor descendente efectu o reconhecimento de um frse construindo um árvore de derivção prtindo d riz e terminndo ns folhs, crindo os nós d árvore segundo um trvessi descendente d esquerd pr direit Este processo pode tmém ser visto, pr este tipo de lingugens, como derivção pel esquerd de um dd frse Vejmos um exemplo: Exemplo 41 Considere-se seguinte grmátic: G = ({,, c}, {I,, B}, I, P ) com P o seguinte conjunto de produções: 1 (Versão 18) I B 47
48 CPÍTULO 4 NÁLIE INTÁCTIC DECENDENTE c B B e frse c Est frse é reconhecid com sucesso trvés d seguinte árvore de derivção: I c frse reconhecid (ou reconhecer) é dd pels folhs d árvore, sendo que os nós interiores vão ser ocupdos por não-terminis Definição 41 (Árvore de Derivção) ej G = (T, N, I, P ) um grmátic independente do contexto e α 1 α n P, então existe um árvore de derivção cuj riz é e cujs su-árvores são 1,, n (nest ordem) em que: i consiste num único nó ssocido o símolo α i, com α i T ; i é um árvore de derivção cuj riz é α i, com α i N Exemplo 42 Considere-se seguinte grmátic: G = ({,, c}, {I,, B}, I, {I, I B, c,, B c}) e sej c frse reconhecer Temos que plicção ds diferentes regrs de produção vi-nos permitir construir seguinte árvore de derivção: α 1 = α 2 = α 3 = c I c c fronteir coincide com frse reconhecer, temos então um reconhecimento feito com sucesso No entnto, e pr este mesmo exemplo, podemos gerr s árvores
42 GRMÁTIC LL(1) 49 α 1 = α 2 = α 3 = c I No qul o reconhecimento não é feito com sucesso, árvore já está fechd e ind há símolos n frse reconhecer Ou então: α 1 = I B B No qul o reconhecimento tmém não é feito com sucesso, árvore não está fechd ms chegou-se um ponto em que não é possível continur su construção Temos então que um reconhecedor cpz de lidr com ests situções teri de ser cpz de recur sore decisões errds pr tentr outrs soluções té esgotr tods s soluções, ou té ser em sucedido num dels N prátic não se vão implementr reconhecedores com recuo ( cktrcking ) ddo não serem eficientes 42 Grmátics LL(1) Pr grntir que nunc surgem miguiddes n escolh d produção utilizr empregm-se grmátics em que tods s produções d form: α 1 α 2 α n derivm frses cujos símolos iniciis são todos diferentes Ou sej temse um conjunto de produções pr s quis st olhr pr o primeiro símolo pr ser qul é escolh correct No entnto podem surgir situções em que não st conhecer os primeiros símolos de cd um ds produções do tipo referido cim pr evitr situções mígus É esse o cso qundo se tem que um ddo símolo (primeiro símolo de um dd produção) é um símolo nulável, isto é um símolo prtir do qul se deriv frse nul, formlmente: Definição 42 (ímolo nulável) Um símolo não terminl diz-se nulável se existe ɛ
50 CPÍTULO 4 NÁLIE INTÁCTIC DECENDENTE Então, nestes csos é necessário ser qul o símolo que vêm seguir (símolo nulável) pr deste modo poder evitr situções mígus s grmátics livres do contexto que evitm estes dois prolems designmse por grmátics LL(1), de: L Left scn leitur d esquerd pr direit L Leftmost derivtion derivção pel esquerd (1) Um símolo ntecipável Pr podermos definir s condições que um grmátic independente do contexto tem de verificr pr ser um grmátic LL(1) é necessário definir ntes lgums funções uxilires ão els: First: define o conjunto de símolos que inicim derivções prtir de um sequênci d símolos terminis e não-terminis First N define o conjunto de símolos que inicim derivções prtir de um símolo não-terminl Follow define o conjunto de símolos que se podem seguir derivr por um ddo símolo não terminl Definição 43 (First) função First define-se como: F irst : (N T ) 2 T α F irst(α) tl que, pr todo o T e α (N T ) tem-se:, α = ɛ {}, α = α F irst(β F irst(α) = i ), α = α e β 1 β n e 1 i n β i ɛ pr todo o 1 i n F irst(α ) F irst(β i ), α = α e β 1 β n e 1 i n β i ɛ pr um ddo 1 i n Exemplo 43 Pr grmátic, G = ({,, c}, {I,, B}, I, {I B Bc Bc; ɛ; B c}) tem-se: F irst(b) = {} F irst(bc) = F irst() F irst(c) (B ɛ) = {} {c} = {, c} F irst(bc) = F irst() F irst(ɛ) F irst(bc) ( ɛ) = {} F irst() F irst(c) = {} {} {c} = {,, c}
42 GRMÁTIC LL(1) 51 Definição 44 (First N ) função First N define-se como: F irst N : N 2 T X F irst N (X) = (X α i ) F irst(α i ) Exemplo 44 Usndo grmátic G definid no exemplo nterior temos: F irst N (I) = F irst(b) F irst(bc) F irst(bc) = {} {, c} {,, c} = {,, c} F irst N () = F irst() F irst(ɛ) = {} F irst N (B) = F irst() F irst(c) = {, c} Definição 45 (Follow) função Follow define-se como: F ollow : N 2 T X F ollow(x) tl que, pr todo o Y N ( e α, β (N { T ) tem-se:, se X ɛ F ollow(x) = F irst(β) F ollow(y ), se X ɛ (Y αxβ) ) Exemplo 45 Usndo grmátic G definid no exemplo nterior temos: F ollow(i) = F ollow() = F irst(c) F irst(bc) (F irst(ɛ) F ollow()) = {, c} F ollow(b) = F irst() F irst(c) F irst(c) = {} {, c} {c} = {, c} Podemos gor definir condição LL(1) Definição 46 (Condição LL(1)) Um grmátic G = (T, N, I, P ) stisfz condição LL(1) se, pr tod produção α 1 α 2 α n P, se verificrem s seguintes condições: 1 Pr ɛ então: F irst(α i ) F irst(α j ) = i j, 1 i, j n ie o conjunto de símolos que inicim frses derivds de dois ldos direitos de produções com o mesmo ldo esquerdo devem ser disjuntos
52 CPÍTULO 4 NÁLIE INTÁCTIC DECENDENTE 2 Pr ɛ então: então F irst N () F ollow() = ie no cso de símolos nuláveis, o conjunto de símolos que inicim derivções prtir de, tem de ser disjunto do conjunto de símolos que se possm seguir qulquer sequênci gerd por Exercício 41 Ddo grmátic G com: G = ({,, c, d, e}, {I,, B, C}, I, P ) P = {I B, ɛ, B cc d, C e} verifique se G é LL(1) condição LL(1) pode-se reescrever trvés de um outr função uxilir que de lgum form sintetiz s nteriores Definição 47 (Lookhed) função Lookhed define-se como: Lookhed : P 2 T {, se α ɛ ( α) F irst(α) F ollow(), se α ɛ Exemplo 46 Pr grmátic, G = ({,, c}, {I,, B}, I, {I B Bc Bc; ɛ; B c}) tem-se: Lookhed( ) = F irst() = {} Lookhed( ɛ) = F irst(ɛ) F ollow() = {,, c} Usndo função Lookhed é então possível redefinir condição LL(1), sendo que ms s vrintes são equivlentes entre si Definição 48 (Condição LL(1)) Um grmátic G = (T, N, I, P ) stisfz condição LL(1) se pr quisquer produções α 1, α 2 se tenh: Lookhed( α 1 ) Lookhed( α 2 ) =
42 GRMÁTIC LL(1) 53 Exercício 42 Dd grmátic G = ({,, c, d, e}, {I,, B, C}, I, P ) com P o seguinte conjunto de produções: I B ɛ B cc d C e verifique (usndo função Lookhed ) que G stisfz condição LL(1) 421 Trnsformções Essenciis à Condição LL(1) Existem váris situções típics onde se verificm conflitos LL(1), isto é, situções de não cumprimento d condição LL(1) 1 Grmátics mígus; 2 Grmátics recursivs à esquerd Pr cd um dests dus situções existem trnsformções que podem ser feits ns produções de form trnsform um dd grmátic num outr que verifique condição LL(1) Vejmos mos os csos de seguid Grmátic mígus, grmátics com produções com o mesmo ldo esquerdo e cujos ldos direitos têm o mesmo prefixo, por exemplo: Considere-se s seguintes produções: αβ αγ existe um conflito LL(1) ddo que: Lookhed( αβ) Lookhed( αγ) F irst(α) solução consiste em efectur um fctorizção à esquerd α β γ correcção dest trnsformção demonstr-se trvés d álger de expressões regulres αβ αγ = αβ + αγ = α(β + γ) α = α β + γ = β + γ
54 CPÍTULO 4 NÁLIE INTÁCTIC DECENDENTE Grmátic recursivs à esquerd Considere-se s seguintes produções: temos que α β F irst N () = F irst(α) F irst(β) existe um conflito LL(1) n medid que: Lookhed( α) Lookhed( β) F irst(β) solução pss por eliminr recursividde à esquerd reescrevendo grmátic com recursividde à direit β α ɛ novmente é fácil de demonstrr correcção dest trnsformção α β = α + β = β + α = βα = (βα )ɛ = β(α ɛ) β = β α ɛ = ɛ + α Exercício 43 Fç s trnsformções necessáris pr que grmátic G = ({x, y, z}, {I, X, Y }, I, P ) com P o seguinte conjunto de produções: verifique condição LL(1) I zx zy X Xx x Y yy ɛ Pode-se dizer em relção os reconhecedores descendentes que: su implementção é simples; trnsformção de um grmátic de form que el psse verificr condição LL(1) fz que: sej necessário introduzir novos símolos;
43 RECONHECEDOR RECURIVO DECENDENTE 55 o reconhecimento de um frse sej feito trvés de um sequênci de derivção com um mior número de pssos; árvore de derivção que se otém durnte o reconhecimento não represent fielmente su estrutur sintáctic implementção de um reconhecedor descendente pode ser feit utilizndo dus estrtégis distints: Reconhecedor Recursivo Descendente; Reconhecedores Dirigidos por um Tel 43 Reconhecedor Recursivo Descendente Um reconhecedor recursivo descendente (RRD) de um lingugem L definid pel grmátic G = (N, T, I, P ) constrói-se ssocindo cd símolo X N um procedimento de reconhecimento O reconhecedor pr L otém-se por cominção de todos os procedimentos definição dos procedimentos pode ser feit trvés de dus proximções distints: escrever os procedimentos tendo por se os grfos de sintxe d lingugem; escrever os procedimentos tendo por se s produções d grmátic Vmos explorr somente primeir dests dus proximções possíveis 431 Construção de um RRD prtir dos Grfos de intxe Como pré-condição é necessário verificr que grmátic verific condição LL(1) trnsformção de um grfo de sintxe num reconhecedor vi-se processr trvés d ssocição cd estrutur ásic de um grfo de sintxe um procedimento de reconhecimento, com posterior cominção dos diferentes procedimentos Vi-se ssumir que: os símolos reconhecer são crcteres, est simplificção é plusível ddo podermos ver o reconhecimento sintácticos como um segundo psso já pós o reconhecimento léxico; existe um vriável glol sim qul contém o próximo símolo reconhecer; o vnço pr o próximo símolo é feito trvés d função ler(); o resultdo do reconhecimento é ddo por T (α)
56 CPÍTULO 4 NÁLIE INTÁCTIC DECENDENTE x se sim==x ent~o sim = ler() sen~o erro fimse α T(α); α 1 α i α n T(α 1); T(α i); T(α n); α 1 α i α n cso sim sej First(α 1) : T(α 1); First(α i) : T(α i); First(α n) : T(α n); noutros csos erro fimcso α enqunto sim First(α) T(α); fimenqunto Exercício 44 Fç construção de um reconhecedor pr lingugem L definid pelo seguinte grfo
43 RECONHECEDOR RECURIVO DECENDENTE 57 I c Os reconhecedores RRD são stnte simples de desenvolver, no entnto su estrutur recursiv pode levntr prolems de eficiênci Pr resolver esse prolem existe um outr estrtégi de construção de um reconhecedor de grmátics, designdos por Reconhecedores Dirigidos por um Tel (RDT), estes reconhecedores sustituem recursão pel utilizção de um pilh Por questões de tempo não se vi proceder qui o estudo desse tipo de reconhecedores