Sieci i Systemy Wirtualne |
||||||||||
|
||||||||||
MENU
|
1. Cel projektuCelem projektu jest zaimplementowanie w środowisku Delphi kompilatora podzbioru poleceń języka Pascal. Kompilator ma za zadanie dokonać podziału analizowanego kodu na leksemy, sprawdzić jego poprawność i ostatecznie wykonać.
2. Dokument specyfikacji BNF analizatora leksykalnego.<operacja_przypisania>::= “:=”
3. Przejścia poszczególnych kroków działania interpretera (wykonywania operacji skanowania, parsowania i wykonywania).Chodzi o to, że użytkownik może wykonywać poszczególne kroki osobno, albo spowodować od razu ich wykonanie automatycznie, sekwencyjnie (jeżeli nie ma błędów w poprzednim kroku).
4. Algorytm i opis działania kroku „Scan”.Dzieli plik na leksemy i umieszcza je w zmiennej typu TStringList (dynamiczna lista przechowująca wartości typu String). Wykrywa leksemy: oznacz Blad_w_linii := -1; //na razie nie ma błędów dla każdej linii pliku (zawartości kontrolki RichEdit1) wykonuj:
5. Funkcje składające się na działanie Skanera:.- funkcja scan zwracająca true jeśli skanowanie przebiegło pomyślnie, a false w przeciwnym wypadku. function scanuj():boolean; - funkcja sprawdz_znak zwracająca wartość liczbową większą od zera jeśli rozpoznany leksem na aktualnie rozpatrywanej pozycji jest poprawny (wtedy zwraca liczbę określającą gdzie ten rozpatrzony leksem się kończy). Zwraca zero, jeśli nie może rozpoznać leksemu w zmiennej linia od pozycji określonej przez zmienną wsk. Zwraca wartość ujemną gdy wykryto ciąg znaków otoczony apostrofami oraz dodaje te leksemy ( apostrof ciag znaków apostrof) do zmiennej globalnej leksemy. function sprawdz_znak(linia:string;wsk:integer): integer; - funkcja cyfra zwracająca wartość logiczną wskazującą czy znak podany jako argument jest cyfrą function cyfra(c:char):boolean; - funkcja liczba zwracająca wartość logiczną wskazującą czy znak podany jako argument jest liczbą function litera(c:char):boolean;
6. Parser.Zadaniem parsera jest sprawdzenie składni programu napisanego przez użytkownika. W programie sprawdzane są po kolei wszystkie kombinacje leksemów. I tak:
7. Funkcje i procedury dla Parsera.- funkcja parse zwracająca true jeśli parsowanie przebiegło pomyślnie, a false w przeciwnym wypadku, function parse():boolean;
- procedura usun_zbedne_spacje- usuwa nadmierną ilość spacji (np.: jeśli leksem jest ciągiem spacji),
8. Funkcje i procedury dla modułu interpretera.Procedura setTables; - ustawiająca tablicę ze zmiennymi określonych typów oraz ich wartości początkowe. Szukaj słowa kluczowego ‘var’ i zapamiętaj jego indeks w tablicy leksemów Dopóki nie napotkano słowa kluczowego ‘begin’ Ustaw początkowe wartości w tablicach wartości dla poszczególnych typów zmiennych. Pomiń ewentualne wystąpienia ‘begin’,’end’ i ’;’ Jeśli początkowym leksemem jest ‘write’ lub ‘writeln’- wyświetl wszystkie leksemy aż do napotkania ‘);’, pomijając znaki ‘,’ oraz ‘’’.Wartości ewentualnych zmiennych przekonwertuj do postaci ‘łańcucha znaków’ Jeśli początkowym leksemem jest ‘read’ lub ‘readln’ przekaż zmienną w nawiasach procedurze setVariable(variable:string) Jeśli drugim leksemem jest ‘:=’ to przekaż indeks od którego zaczyna się wyrażenie oraz indeks końcowy(poprzedzający średnik) funkcji Jeśli początkowym leksemem jest ‘if’ szukaj leksemu ‘then’ i zapemiętaj jego pozycję dopóki liczba wystąpień leksemów ‘begin’ i ‘end’ jest różna i Przekaż początkowy i końcowy indeks w tablicy leksemów dla wyrażenia logicznego Przesuń kursor początkowy ‘startIdx’ na pozycję końca bloku kodu do wykonania
Jeśli początkowym leksemem jest ‘while’ szukaj leksemu ‘do’ i zapemiętaj jego pozycję dopóki liczba wystąpień leksemów ‘begin’ i ‘end’ jest różna i Dopóki funkcja compareExpressions(startIdx:Integer;endIdx:Integer) :Boolean Przesuń kursor początkowy ‘startIdx’ na pozycję końca bloku kodu do wykonania Jeśli kursor początkowy nie stoi na pozycji kursora końcowego wywołaj
|
|||||||||
AP Siedlce @ 2007 |