PARSER


Funkcja parsera

Zadaniem parsera jest przeanalizowanie poprawności składni programu. Parser jako dane wejściowe otrzymuje liste leksem wygenerowaną przez skaner. Przeglądając tę właśnie listę analizuje poprawność składni każdej instrukcji i części programu. Analizowane jest nie tylko składnia ale również dopasowanie typów zmiennych w operacjach arytmetycznych i logicznych, jak również w deklaracji zmiennych.
Wystapienie błędu w składni programu powoduje wyświeltenie komunikatu o błędzie.

Jak działa parser?

Parser jest uruchamiany w momencie klikniecia przycisku PARSUJ. Uruchomiona zostaje wtedy funkcja parser(), która analizuje wcześniej utworzoną listę wszystkich leksemów jakie zostały rozpoznane przez skaner występujących w kodzie programu.
Za rozpoznawanie poprawnej składni odpowiada szereg funkcji:
Są to funckje:

    function programp():boolean;
    function blok():boolean;
    function dekl_zmiennych():boolean;
    function wyr_arytmetyczne(var t:string):boolean;
    function wyr_logiczne():boolean;
    function oper_przypisania():boolean;
    function funkcja_if():boolean;
    function funkcja_while():boolean;
    function funkcja_for():boolean;
    function funkcja_read():boolean;
    function funkcja_write():boolean;
    function czyjest(naz:string):boolean;
    function typzmiennej(naz:string):string;

Funkcje te odpowiadają za sprawdzanie poszczeglnych cześci (fragmentów) kodu programu odpowiednio do swojej nazwy i są wywoływane zgodnie z notacja BNF języka PASCAL. Dwie ostatnie funkcje służą dosprawdzenia czy dany identyikator występuje w deklaracji zmiennych (po prostu czyjest ot zmienna) oraz do zwracania typu wskazanej przez parametr zmiennej.

W trakcie działania funkcji dekl_zmiennych() powstaje lista zmiennych i stałych(o watościach: nazwa, typ, wartość), które zostają zadeklarowane w programie. Elementy dodawane są dotej listy w momencie gdy parser napotyka poprawną deklaracje zmiennej bądź stałej. Stałe mają od poczatku przypisaną ustaloną wartość natomiast zmienne poczatkowo mają wartość null i dopiero w trackie działania programu ich watości mogą ulec zmianie.

Każda niepoprwna składniowo instrukcja zostaje zidentyfikowa przez odpowiednią funkcje i informacja o nieprawidłowości składni zostaje dodana do listy błedów, która jest wypisywana na ekran po zakończeniu działania parsera

Przed przystąpieniem do pracy parsera uruchamiane zostają procedury pomocnicze :

    procedure szukajSlowKluczowych();
    procedure szukajLiczb();
    procedure szukajZmiennych();
    procedure szukajSlow();
    procedure beginend();

Mają one za zadanie przygotowanie listy leksem do pracy parsera. Pierwsza z nich szukajSlowKluczowych() wyszukuju w leksemach typu 'słowo' słowa kluczowe jezyka Pascal i oznaczaodpowiednio znalezione słowa. Druga procedura szukajLiczb() szuka deklaracji liczb rzeczywistych (typu 'real'). Procedura szukajZmiennych() uruchamiana jest dopiero w momenncie gdy parser poprawnie zakończył analizować cześc programu w której deklarowane są zmienne i stałe. Pozwalana wyszukanie w bloku prokramu wszystkich zadeklarowaanych zmiennych. Procedura szukajSlow() uruchamiana jest w po zakończeniu działania procedury szukajZmiennych(). W tym momencie wśród leksem programu nie powinno zostać żadnej lesemy typu 'słowo'. Gdy taka leksema wystąpi wyrzucany jest błąd 'Niezdefiniowany identyfikator'. Ostatnia procedura beginend() zlicza ilość i kolejność wystąpień słów kluczowych begin oraz end.

Gdy składnia całego programu jest poprawna na ekranie wyświetli się odpowiednia informacja, jeżeli natomiast wystapi jakikolwiek błąd dodany on zostanie do listy błędów i po zakończeniu działąnia parsera wypisany na ekran.

Kod źródłowy funkcji składających się na parser.