Zadanie 1
Zakodować automat skończony rozpoznający język składający się z
czterch słów 'do', 'downto', 'for', 'to'. Automat powinien
odzczytywac (i aktualizować) zmienna 'biezacy_znak' (tak naprawde
ten znak to podglad). Zakładamy że przed wywołaniem automatu
zmienna 'biezacy_znak' jest wypełnina pierwszym znakiem tekstu,
automat ma "zjeść" rozpoznane słowo i zostawić w zmiennj
'biezacy_znak' następny znak.
Rozszerzyć automat, tak by dodatkowo rozpoznwał dowolne ciągi
spacji. Następnie dodać rozpoznawanie identyfikatorów (dowolnych
ciągów liter).
Uwaga: Automat ma wybierać ciąg maksymalnej długości tzn. 'down'
jest identyfikatorem a całe 'downto' to słowo kluczowe. Kolejne
wywołania automatu mają dawać kolejne słowa (a właściwie na przemian
ciągi spacji i słowa).
Zadanie 2
Zapoznać się z przykładowym kompilatorem. Zmodyfikować go, np:
- dodać pomijanie spacji
- obsłużyć wieloznakowe nazwy (prosta metoda rozróżniałaby tylko
kilka pierwszych znaków, można użyć zewnętrzną bibliotekę np. STL
do obsługi nazw dowolnej długości)
- dodać operator '%' (o takim samym priorytecie jak '*' i '/')
- dodać operator '**' (potęgowanie)
- przerobić 'pisz' tak by brało wyrażenie jako argument
- dodać instrukcję postaci 'czytaj(x);' do wczytywania liczb
Zadanie 3
Napisać funkcję (analizator sytaktyczny) który wyprodukuje
strukturę drzewiastą (podobną do tej produkowanej przez
przykładowy kompilator) z :
- wyrażeń arytmetycznych w stylu prefiksowym, np. '+2*3,4'
(gdzie przecinek oddziela kolejne liczby)
- wyrażeń arytmetycznych w stylu Lispu, np. '(+ 2 (* 3 4))'
(wyrażenia są ujęte w nawiasy, operator jest pierwszy,
składniki są oddzielone spacjami)
- wyrażeń arytmetycznych w notacji postfixowej, np. '2,3,4*+;'
czy '2,3*4+;' (przecinek oddziela liczby, średnik kończy wyrażenie)
Pierwsze dwa warianty łatwo zrobić rekursywnie, trzeci łatwo zrobić
czytając wyrażenie of końca, jeśli czyta się od początku to trzeba użyć
stos.
Zadanie 4
Napisać funkcję która mająć daną strukturę drzewiastą (zrobioną
przez funkcję z Zadania 3) wypisze wyrażenie z powrotem w jednej
z form zewnętrznych (podobnie jak funkcja 'wypisz' przykładowego
kompilatora).