Wprowadzenie ZstÄ™pujÄ…ca analiza skÅ‚adniowa Analiza skÅ‚adniowa jest drugÄ… fazÄ… kompilacji (po analizie JÄ™zyki formalne i techniki translacji - WykÅ‚ad 7 leksykalnej). Analiza skÅ‚adniowa przetwarza dane w postaci symboli leksykalnych na drzewo wyprowadzenia pewnej gramatyki. Maciek GÄ™bala Sprawdzanie kodu pod wzglÄ™dem poprawnoÅ›ci skÅ‚adni. Gromadzenie dodatkowych informacji, np. w tablicy symboli, potrzebnych dla dalszych kroków kompilacji. 3 kwietnia 2013 Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Typy analizatorów skÅ‚adniowych PrzykÅ‚ad niejednoznacznoÅ›ci Rozważmy gramatykÄ™ dla prostych wyrażeÅ„ arytmetycznych E E + E|E " E|E - E|E/E| - E|id ZstÄ™pujÄ…ce (top-down) tworzenie drzewa wyprowadzenia od Wezmy sÅ‚owo id + id " id góry. Mamy dwa różne wyprowadzenia lewostronne WstÄ™pujÄ…ce (bottom-up) tworzenie drzewa wyprowadzenia od liÅ›ci w górÄ™ do korzenia. E Ò! E + E Ò! id + E Ò! id + E " E Metody te dziaÅ‚ajÄ… tylko dla pewnych podklas gramatyk bezkontekstowych (jednoznaczne, deterministyczne). Ò! id + id " E Ò! id + id " id E Ò! E " E Ò! E + E " E Ò! id + E " E Ò! id + id " E Ò! id + id " id Gramatyka jest wiÄ™c niejednoznaczna. Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Eliminowanie niejednoznacznoÅ›ci Eliminacja lewostronnej rekurencji Niejednoznaczność można czasami wyeliminować. Jak zmienić gramatykÄ™ instr if wyr then instr | if wyr then instr else instr Gramatyka jest lewostronnie rekurencyjna jeÅ›li istnieje nieterminal A taki, że istnieje wyprowadzenie A Ò!+ AÄ… dla pewnego Ä…. | inna Metody zstÄ™pujÄ…ce (up-down) nie dajÄ… siÄ™ zastosować do takich gramatyk. Gramatyka jednoznaczna instr p_instr|n_instr LewostronnÄ… rekurencjÄ™ można wyeliminować. p_instr if wyr then p_instr else p_instr | inna n_instr if wyr then instr | if wyr then p_instr else instr Porównaj wyprowadzenia dla if E1 then if E2 then I1 else I2 Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa ObsÅ‚uga bÅ‚Ä™dów Tryb paniki W przypadku wystÄ…pienia bÅ‚Ä™du wypisujemy go (czytelnie z podaniem miejsca wystÄ…pienia) i staramy siÄ™ kontynuować przetwarzanie. Sposób najprostszy w implementacji. Po natrafieniu na bÅ‚Ä…d usuwamy kolejne symbole aż trafimy na Strategie odzyskiwania kontroli taki który umożliwi nam ponownÄ… synchronizacjÄ™ danych z analizatorem (np. ograniczniki instrukcji). tryb paniki Mimo ominiÄ™cia pewnej liczby symboli metoda pozwala Å‚atwo poziom frazy kontynuować pracÄ™. produkcje dla bÅ‚Ä™dów korekta globalna Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Poziom frazy Produkcje dla bÅ‚Ä™dów Po wykryciu bÅ‚Ä™du analizator stara siÄ™ zmienić lokalnie wejÅ›cie Rozszerzamy gramatykÄ™ o produkcje generujÄ…ce bÅ‚Ä™dna aby kontynuować analizÄ™. konstrukcje dla najczÄ™stszych bÅ‚Ä™dów. Typowe zastosowania: zmiana niewÅ‚aÅ›ciwego separatora, Generujemy komunikat o bÅ‚Ä™dzie w przypadku użycia produkcji dodanie koÅ„cowego ogranicznika instrukcji. dla bÅ‚Ä™du (ale nie przerywamy analizy, jest ona poprawna wzglÄ™dem tak poprawionej gramatyki). W pewnych sytuacjach może to spowodować zapÄ™tlenie. Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Korekta globalna Analiza metodÄ… zstÄ™pujÄ…cÄ… " Mamy ciÄ…g tokenów (terminali) w " T i gramatykÄ™ Staramy siÄ™ znalezć dla caÅ‚ego tekstu minimalnÄ… liczbÄ™ G = (N, T , P, S). poprawek, które spowodujÄ…, że tekst stanie siÄ™ poprawny Chcemy sprawdzić czy w " L(G)? gramatycznie. Szukamy lewostronnego wyprowadzenia dla w. Metoda czasochÅ‚onna i nie zawsze poprawiajÄ…ca w kierunku o Budujemy drzewo wyprowadzenia dla w zaczynajÄ…c od korzenia jaki chodziÅ‚o w tekÅ›cie wejÅ›ciowym. i tworzÄ…c wierzchoÅ‚ki w porzÄ…dku preorder. Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa PrzykÅ‚ad PrzykÅ‚ad Wezmy napis w = cad i gramatykÄ™ Wezmy gramatykÄ™ S cAd S aAd|aB A ab|a A b|c Zaczynamy od symbolu poczÄ…tkowego, pierwszÄ… literÄ… w jest c B ccd|ddc wiÄ™c bierzemy produkcjÄ™ S cAd i wyprowadzamy S Ò! cAd Pierwsza litera cAd jest zgodna z pierwszÄ… literÄ… w wiÄ™c Wezmy sÅ‚owo w = accd przechodzimy do symboli A i a. Możemy teraz użyć produkcji S Ò! aAd A ab i otrzymać ciÄ…g cabd. S Ò! aAd Ò! abd yle, abd = accd, nawracamy
Druga litera siÄ™ zgadza wiÄ™c sprawdzamy trzeciÄ…. Niestety mamy S Ò! aAd Ò! acd yle, acd = accd, nawracamy
d i b czyli zle. Musimy wrócić do A i poszukać alternatywnego S Ò! aB wyprowadzenia. S Ò! aB Ò! accd OK Używamy produkcji A a i tym razem jest dobrze. UzyskaliÅ›my wyprowadzenie: S Ò! cAd Ò! cad. Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Faktoryzacja lewostronna Algorytm lewostronnej faktoryzacji gramatyki Dla każdego nieterminala A znajdz najdÅ‚uższy prefiks Ä… wspólny dla co najmniej dwóch prawych stron A-produkcji. Kiedy nie jest jasne na podstawie pierwszego symbolu, którÄ… JeÅ›li Ä… = µ to zamieÅ„ produkcje
produkcjÄ™ wybrać do rozwiniÄ™cia nieterminala, przeksztaÅ‚camy te produkcje tak aby decyzjÄ™ podjąć pózniej. A Ä…²1| . . . |Ä…²n|Å‚1| . . . |Å‚m na produkcje PrzykÅ‚ad instr if wyr then instr else instr|if wyr then instr A Ä…B|Å‚1| . . . |Å‚m instr if wyr then instr koniec B ²1| . . . |²n koniec else instr|µ gdzie B jest nowym dodatkowym nieterminalem. TransformacjÄ™ powtarzamy dopóki zmienia ona gramatykÄ™. Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Analizatory przewidujÄ…ce PrzykÅ‚ad Wezmy gramatykÄ™ E E+T |T T T "F |F CzÄ™sto uważnie tworzÄ…c gramatykÄ™, usuwajÄ…c w niej lewostronnÄ… F (E)|id rekurencjÄ™ i wykonujÄ…c lewostronnÄ… faktoryzacjÄ™ możemy uzyskać gramatykÄ™, która przy wyprowadzeniu nie potrzebuje nawrotów. Eliminujemy lewostronnÄ… rekurencjÄ™ E TG Wyprowadzenie w takiej gramatyce może być Å‚atwo sprawdzane G +TG|µ prostym, deterministycznym automatem ze stosem. T FV V "FV |µ F (E)|id Gramatyka nie potrzebuje lewostronnej faktoryzacji. Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa DziaÅ‚anie analizatora przewidujÄ…cego na id + id " id Zbiory FIRST i FOLLOW Stos WejÅ›cie WyjÅ›cie FIRST pomaga wybrać produkcjÄ™ którÄ… możemy użyć do $E id + id " id$ wyprowadzania napisu. $GT id + id " id$ E TG $GVF id + id " id$ T FV FIRST (Ä…) = {x " T : "² Ä… Ò!" x²} $GV +id " id$ F id $G +id " id$ V µ FOLLOW pomaga synchronizować symbole podczas $GT id " id$ G +TG odzyskiwania kontroli w trybie paniki. $GVF id " id$ T FV $GV "id$ F id FOLLOW (A) = {x " T : "Ä…"² S Ò!" Ä…Ax²} $GVF id$ V "FV Na podstawie tych funkcji generujemy tablicÄ™ analizatora $GV $ F id przewidujÄ…cego która dla nieterminala A i terminala a wyznacza $G $ V µ którÄ… produkcjÄ™ możemy użyć. $ $ G µ Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Wyznaczanie FIRST (X ) Wyznaczanie FOLLOW (A) Dla wszystkich symboli X z gramatyki G tworzymy zbiory FIRST wedÅ‚ug nastÄ™pujÄ…cych reguÅ‚ Dla wszystkich nieterminali A FOLLOW (A) tworzymy wedÅ‚ug 1 JeÅ›li X jest terminalem to FIRST (X ) = {X }. nastÄ™pujÄ…cych reguÅ‚ 2 JeÅ›li X µ jest produkcjÄ… to do FIRST (X) dodajemy µ. 1 Dla symbolu poczÄ…tkowego S do FOLLOW (S) dodajemy $. 3 JeÅ›li X jest nieterminalem i X Y1Y2 . . . Yk to a dodajemy do 2 JeÅ›li mamy produkcjÄ™ A Ä…B² to do FOLLOW (B) dodajemy FIRST (X ) jeżeli istnieje i takie, że a " FIRST (Yi) oraz wszystkie symbole z FIRST (²) poza µ. µ " FIRST (Yj) dla każdego j < i. µ " FIRST (X ) jeÅ›li należy do 3 JeÅ›li mamy produkcjÄ™ A Ä…B albo produkcjÄ™ A Ä…B², gdzie wszystkich FIRST (Yi) µ " FIRST (²) to do FOLLOW (B) dodajemy wszystkie symbole z Ponadto FOLLOW (A). FIRST (X Ä…) = FIRST (X ) gdy µ " FIRST (X ) / FIRST (X Ä…) = FIRST (X ) *" FIRST (Ä…) gdy µ " FIRST (X) Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa PrzykÅ‚ad Budowa tablic analizatora przewidujÄ…cego FIRST (E) = FIRST (T ) = FIRST (F ) = {(, id} Dla każdej produkcji A Ä… FIRST (G) = {+, µ} 1 dla każdego a " T jeÅ›li a " FIRST (Ä…) to wpisz A Ä… do M[A, a]. FIRST (V ) = {", µ} 2 jeÅ›li µ " FIRST (Ä…) to dla każdego b " FOLLOW (A) wpisz A Ä… FOLLOW (E) = FOLLOW (G) = {), $} do M[A, b]. FOLLOW (T ) = FOLLOW (V ) = {+, ), $} FOLLOW (F ) = {+, ", ), $} Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa PrzykÅ‚ad id + " ( ) $ E TG TG G +TG µ µ T FV FV V µ "FV µ µ F id (E) Maciek GÄ™bala ZstÄ™pujÄ…ca analiza skÅ‚adniowa