Anlisdores intáticos Análise Descendente (Top-down) Anlisdores sintáticos descendentes: Recursivo com retrocesso (bcktrcking) Recursivo preditivo Tbulr preditivo Análise Redutiv (Bottom-up) Anlisdores de precedênci d operdores Anlisdores LR(k) Análise Recursiv com Retrocesso Exemplo 3.6 Pssos de um nlisdor descendente entenç ou progrm: [] Grmátic: e L ; L [ ] $ [ ] $ [ ] $ [ ] $ [ ] $ [ ] $ ucesso! ; L ; L ; L Expndir L Fonte: Implementção de Lingugens de Progrmção: Compildores. An Mri Price & imão. Toscni. Ed. gr Luzztto, 2000. Expndir ucesso! Flh! ucesso! Exemplo 3.7 Implementção Exemplo 3.1 sem bcktrcking begin /* min */ token := LETOKEN; if then if token = $ then write( sucesso ) else write( erro1 ) else write( erro2 ) end function ; if token = then { } else if token = [ then if L then if token = ] then { } function L; MARCA_PONTO; if then if token = ; then { if L then } else { RETROCEDE; if then } begin /* min */ token := LETOKEN; if then if token = $ then write( sucesso ) else write( erro ) else write( erro ) end function ; if token = then { } else if token = [ then if L then if token = ] then { } function L; if then if token = ; then { if L then } else Análise Recursiv Preditiv Exigêncis: Grmátic sem recursividde à esquerd Grmátic estej ftord à esquerd Pr os não-terminis com mis de um regr de produção, os primeiros terminis deriváveis devem ser cpzes de identificr, univocmente, regr de produção ser plicd Exemplo 1: Comndo if Expr then Comndo while Expr do Comndo repet List until Expr id := Expr Análise Recursiv Preditiv Exemplo 2: Comndo Condicionl Itertivo Atribuição Condicionl if Expr then Comndo Itertivo while Expr do Comndo repet List until Expr Atribuição id := Expr FIRT(β): e β * ε então ε é um elemento de FIRT(β); e β * δ então é um elemento de FIRT(β), sendo um símbolo terminl e δ um form sentencil qulquer, podendo ser vzi 1
Exemplo 3.8 Anlisdor recursivo preditivo: implementção function Comndo; if token = if then if Condicionl then else if token = while or token = repet then if Itertivo then else if token = id then if Atribuição then Análise Preditiv Tbulr O nlisdor busc produção ser plicd n tbel de nálise, levndo em cont o nãoterminl no topo d pilh e o token sob o cbeçote de leitur Pilh X Y Z $ Fit de entrd + b $ Anlisdor preditivo Tbel de Análise Exemplo 3.10 Pssos de um nlisdor tbulr preditivo Considere grmátic não-mbígu que ger expressões lógics: E E T T T T & F F Eliminndo-se recursividde à esquerd, tem-se: E TE E TE ε T FT T &FT ε Tbel de nálise preditiv: id & $ E E TE E TE E E TE E ε T T FT F FT T T ε T &FT T ε F F id F F Pssos de um nlisdor: Pilh Entrd Ação $E id id&id$ E TE $E T id id&id$ F FT $E T F id id&id$ F id $E T id id id&id$ $E T id&id$ T ε $E id&id$ E TE $E T id&id$ $E T id&id$ T FT......... Algoritmo do Anlisdor Preditivo Tbulr Entrd: Um sentenç s e um tbel de nálise M pr grmátic G Resultdo: Um derivção mis à esquerd de s, se s está em L(G), ou um erro, cso contrário Método: Configurção inicil: pilh=$ e fit=s$ Posicion o cbeçote sobre o primeiro símbolo de s$; ej X o símbolo do topo d pilh e o símbolo sob o cbeçote. Repete e X é um terminl Então e X = Então desempilhe X e vnç o cbeçote enão ERRO enão /* X é um símbolo não-terminl */ e M[X,] = X Y 1 Y 2...Y k Então desempilh X; empilh Y k Y k-1...y 1 com Y 1 no topo; enão ERRO Até que X = $ /* pilh vzi */ Algoritmo do Anlisdor Preditivo Tbulr A mior dificuldde está n construção d tbel de nálise. FIRT(α) é o conj. de terminis que inicim forms sentenciis derivds prtir de α (se α ==>* ε, então plvr vzi tmbém fz prte do conjunto) FOLLOW(A) é o conj. de terminis que podem precer imeditmente à direit de A em lgum form sentencil. Isto é, o conj. de terminis, tl que existe um derivção d form ==>* αaβ pr α e β quisquer. 2
Algoritmo pr clculr FIRT(X) 1) e é terminl, então FIRT() = {} 2) e X ε é um produção, então dicione ε FIRT(X) 3) e X Y 1 Y 2...Y k é um produção e, pr lgum i, todos Y 1,Y 2,...,Y i-1 derivm ε, então FIRT(Y i ) está em FIRT(X). e todo Y j (j=1,2,...,k) deriv ε,, então ε está em FIRT(X) Algoritmo pr clculr FOLLOW(X) 1) e é o símbolo inicil d grmátic e $ é o mrcdor de fim de sentenç, então $ está em FOLLOW() 2) e existe produção do tipo A αxβ, então todos os terminis de FIRT(β) fzem prte de FOLLOW(X) 3) e existe produção do tipo A αx, ou A αxβ, sendo que β ==>* ε, então todos os terminis que estiverem em FOLLOW(A) fzem prte de FOLLOW(X) Exemplo 3.11 Determinção ds funções FIRT e FOLLOW Considere grmátic de expressões lógics: E TE E TE ε T FT T &FT ε FIRT(F) = {, id} FIRT(T ) = {&, ε} FIRT(E ) = {, ε} FIRT(T) = FIRT(F) = {, id} FIRT{E} = FIRT(T) = {, id} FOLLOW(E) = {$} regr 1 FOLLOW(E ) = FOLLOW(E) = {$} regr 3, prod. 1 FOLLOW(T) = FIRT(E ) FOLLOW(E ) = {, $} regrs 2 e 3, prod. 2 e 3 FOLLOW(T ) = FOLLOW(T) = {, $} regr 3, prod. 4 FOLLOW{F} = FIRT(T ) FOLLOW(T ) = {&,, $} regrs 2 e 3, prod.5 Algoritmo pr construir um tbel de nálise preditiv Entrd: Um grmátic G Resultdo: Tbel de nálise M Método: 1) Pr cd produção A α de G, execute os pssos 2 e 3 (pr cd linh A d tbel M) 2) Pr cd terminl de FIRT(α), dicione produção A α M[A,] 3) e FIRT(α) inclui plvr vzi, então dicione A α M[A,b] pr cd b em FOLLOW(A) Def. 3.12 Grmátic LL(1) Um grmátic não recursiv à esquerd é LL(1) ssse, sempre que A αe A β são produções, ocorre que: 1) FIRT(α) FIRT(β) = 2) No máximo um dos dois, α ou β, deriv plvr vzi 3) e β ==>* ε, então FIRT(α) FOLLOW(A) = Análise Redutiv (Bottom-up) Os nlisdores redutivos são chmdos empilh-reduz e são implementdos por utômtos de pilh, com controle dirigido por um tbel de nálise. e, em cd entrd d Tbel de Análise, existe pens um produção, então grmátic é do tipo LL(1). Left to right, Leftmost derivtion, com 1 símbolo de entrd 3
Exemplo 3.13: Movimentos de um Anlisdor Redutivo ej grmátic que ger lists: e L L ; Pr sentenç: [ ; ], tem-se os movimentos: Pilh Entrd Ação $ [ ; ]$ Empilh [ $[ ; ]$ Empilh $[ ; ]$ Reduz $[ ; ]$ Reduz L $[L ; ]$ Empilh ; $[L; ]$ Empilh $[L; ]$ Reduz $[L; ]$ Reduz L L ; $[L ]$ Empilh ] $[L] $ Reduz [L] $ $ Aceit! Análise Redutiv: Hndle ão sequêncis de símbolos que são ldos direitos de produção, tis que sus reduções levm, no finl, à redução pr o símbolo inicil d grmátic, trvés do reverso de um derivção mis à direit. e grmátic G é não-mbígu, então tod form sentencil gerd por G tem extmente um hndle. Reconhecedor empilh-reduz: ções Empilh: coloc no topo d pilh o símbolo que está sendo lido e vnç o cbeçote de leitur; Reduz: substitui o hndle do topo d pilh pelo não-terminl correspondente; Aceit: reconhece que sentenç de entrd foi gerd pel grmátic; Erro: ocorrendo erro de sintxe, chm um subrotin de tendimento erros. Anlisdores de precedênci de operdores Atum sobre clsse ds grmátics de operdores Bstnte eficiente e é plicdo no reconhecimento de expressões Dificuldde em lidr com operdores iguis que tenh significdos distintos ão plicdos um clsse restrit de grmátics Grmátics de Operdores Os não-terminis precem sempre seprdos por símbolos terminis (nunc precem dois terminis djcentes) As produções não derivm plvr vzi E E O E ( E ) id O + - * / ^ E E T T T T & F F F ( E ) id Anlisdores LR(k): (Left to right with Rightmost derivtion) ão cpzes de reconhecer prticmente tods s estruturs sintátics definids por um GLC É um método mis gerl que o precedênci de operdores e pode ser implementdo com o mesmo gru de eficiênci ão cpzes de descobrir erros sintáticos em um momento mis cedo Dificuldde de implementção 4
Anlisdores LR(k): (Left to right with Rightmost derivtion) LR (imple LR) fáceis de plicr, porém plicáveis um clsse restrit de grmátics; LR Cnônicos mis poderosos e plicdos um grnde número de LLC; LALR (Look Ahed LR) nível intermediário e implementção eficiente, que funcion pr miori de lingugens de progrmção. O YACC ger esse tipo de nlisdor. Funcionmento de Anlisdores LR Pilh E m X m : : X 1 E 0 Fit de entrd 1... i... n $ Anlisdor Tbel de Análise A pilh rmzen símbolos d grmátic (X j ) intercldos com estdos (E j ) do nlisdor Estrutur d Tbel de Análise E TA DO AÇÃO TERMINAI empilh reduz ceit erro TRANIÇÃO NÃO-TERMINAI E TA DO 5