Struktura kompilatora: Zadania skanera
Transkrypt
Struktura kompilatora: Zadania skanera
1. co to jest kompilator ? Etapy kompilacji Kompilator: program, który tłumaczy program źródłowy na równoważny program wynikowy. Program źródłowy jest napisany w języku źródłowym, a program wynikowy należy do języka wynikowego. Wykonanie programu kompilatora następuje w czasie tłumaczenia. CECHA ZASADNICZA: program po przetłumaczeniu nie da się zmienić, jest statyczny. Kompilator jako dane wejściowe otrzymuje „cały” program źródłowy i przekształca go na postać wynikową. Program Źródłowy We Kompilator Wy Program wynikowy Struktura kompilatora: KOMPILATOR ANALIZA kod zrodlowy Analizator leksykalny Analizator syntaktyczny SKANER PARSER SYNTEZA Analizator semantyczny Generator kodu pośredniego Optymalizator kodu pośredniego Generator kodu ostatecznego kod wynikowy Tablica symboli (zmiennych, stałych, etykiet, nazw podprogramów) 2. Co to jest analiza leksykalna ? Zadania skanera: - wyodrębnianie tokenów ignorowanie komentarzy ignorowanie białych znaków (spacji, tabulacji, znaków nowej linii…) korelowanie błędów zgłaszanych przez kompilator z numerami linii (skaner może liczyć \n) tworzenie kopii zbioru wejściowego (źródłowego) łącznie z komunikatami o błędach czasami realizacja funkcji preprocessingu, rozwijanie makrodefinicji Zadaniem analizatora leksykalnego jest przetwarzanie danych pochodzących ze strumienia wejściowego a także rozpoznawanie ciągów znaków zbudowanych zgodnie z pewnymi zasadami; Analiza leksykalna jest pierwszą fazą kompilacji; Analiza leksykalna służy wyróżnieniu pewnych obiektów ze strumienia znaków wejściowych. Obiekty te będziemy nazywali tokenami lub leksemami. Do opisu tych obiektów używamy wyrażeń regularnych lub automatów skończonych Automaty skończone opisują te same klasy obiektów co wyrażenia regularne Przykładem generatora analizy leksykalnej jest flex. Głównym zadaniem analizy leksykalnej jest grupowanie znaków strumienia wejściowego w symbole leksykalne inaczej zwane token-ami . Tokeny to inaczej elementarne składniki języka źródłowego np.: liczby, słowa kluczowe, operatory i identyfikatory, nawiasy okrągłe, itd.. 3.. Co to jest analiza składniowa ? Analiza składniowa stanowi kolejny, po analizie leksykalnej etap kompilacji; Analiza składniowa jest przeprowadzana przez analizator składniowy; Do analizatora składniowego dostarczane są dane w postaci symboli leksykalnych; Analizator po zakończeniu pracy zwraca tzw. drzewo rozbioru lub jego uproszczoną wersję (abstrakcyjne drzewo składniowe) Analiza składniowa służy wyprowadzeniu odpowiedniego drzewa (ang. syntax tree). Podstawowym środkiem definiowania języków akceptowalnych przez analizatory składniowe są gramatyki bezkontekstowe (context free grammar) Analiza składniowa jest zwana także analizą hierarchiczną lub synktatyczną . Zadanie m analizy składniowej jest zbadanie, czy jednostki leksyklane tworzą poprawne konstrukcje danego języka programowania (np. : czy zachowana jest odpowiednia kolejność leksemów) . Zadania parsera: -Ma za zadanie dokonać rozbioru syntaktycznego tekstu źródłowego analizowanego programu. -Pracuje na podstawie gramatyki syntaktycznej, która na ogół jest gramatyka bezkontekstowa. -Od parsera oczekujemy odtworzenia wywodu i jakiegoś zanotowania tego wywodu — najczęściej stosowanym sposobem notowania wyprowadzenia jest podanie ciągu numerów produkcji. - Niekiedy równolegle z analiza syntaktyczna parser wykonuje pewne akcje semantyczne jak np. generowanie kodu pośredniego w postaci ONP, tetrad (n-tek), itd. Metody analizy składniowej: -Metoda zejść rekurencyjnych - Metoda zstępująca Analizator LL(1) – Przeglądamy wejście od lewej do prawej strony odtwarzanie wywodu lewostronnego metodą top-down 1-symbol podglądany na wejściu aby jednoznacznie określić numer produkcji którą trzeba zastosować Analizator LR(1) – Przeglądamy wejście od lewej do prawej strony odtwarzanie wywodu prawostronnego metodą bottom- up 1-symbol podglądany na wejściu aby jednoznacznie określić numer produkcji którą trzeba zastosować Przykładem generatora analizy leksykalnej jest LLGEN. 4.. Co to jest analiza semantyczna ? Zadania analizatora semantycznego - Kontrola typów (type checking) –– np. czy operatory nie są, zastosowane do nieodpowiednich operandów; - Kontrola przebiegu sterowania (flow-of-control-checking)–– kompilator musi sprawdzić , czy sterowanie w programie jest przekazywane w odpowiednie miejsce (np. czy nie jest wykonywany skok spoza pętli do jej wnętrza); - Kontrola unikalności (uniqueness checking) –– kompilator powinien sprawdzić, czy pewne obiekty są definiowane w programie tylko jeden raz; - Kontrola powtarzalności nazw (name-related checking) –– kompilator powinien sprawdzić, czy w pewnych konstrukcjach określona nazwa pojawia sie więcej niż jeden raz. Analiza semantyczna ma następujące zadania : Sprawdzanie programu (programu źródłowego) pod względem semantycznej zgodności z definicją języka źródłowego, w jakim program jest napisany; Zbieranie informacji do generacji kodu pośredniego ; -Kontrola zgodności typów; -Kontrola przepływu sterowania; -Unikalność deklaracji - kontrola statyczna; -Powtórzenia nazw - kontrola statyczna;