ZSI Zadanie zaliczeniowe Lab C++ 1. Dany jezyk: CONST ::= ... VAR ::= ... EXPR ::= CONST | VAR | - EXPR | EXPR + EXPR | EXPR - EXPR | ! EXPR | EXPR < EXPR | EXPR = EXPR INSTR ::= VAR := EXPR | if EXPR then INSTR else INSTR | while EXPR do INSTR | INSTR ; INSTR Napisac program wyliczajacy programy w tym jezyku. - Programy zadajemy przez statycznie zbudowane drzewo programu. - CONST reprezentuje stale literalne (wartosci, np. 1, 2). - VAR reprezentuje zmienne (identyfikatory, np. 'x', 'y'). - Srodowisko programu = slownik: (identyfikator,wartosc). - Wyliczenie wyrazenia : srodowisko -> wartosc. - Wyliczenie instrukcji : srodowisko -> srodowisko. - Wartosci logiczne interpretowane tak jak w C/C++. 2. Wersje programu: Wersja prostsza: Zmienne w programie sa reprezentowane jako CHAR, wartosci jako INT, czyli implementujemy srodowisko jako slownik CHAR * INT. Wersja trudniejsza: Programy sa parametryzowane typami zmiennych i wartosci. Oznacza to np. ze nalezy zaimplementowac srodowisko jako szablon paramatryzowany przez IDENTYFIKATOR i WARTOSC. Inne klasy programu tez moga wymagac uzycia szablonow. Stworzone szablony nalezy uzyc do napisania drzewa programu instancjonowanego przez CHAR * INT (to znaczy, ze zmienne beda identyfikowane pojedynczymi znakami, wartosci beda liczbami calkowitymi). W odroznieniu od wersji prostszej, rozwiazanie w wersji trudniejszej pozwala np. na latwe wyliczanie programow w dziedzinie liczb zmiennoprzecinowych (float). 3. Testowanie programu: Testowanie programu polega na statycznym zbudowaniu drzewa prostego programu, wykonaniu programu i wypisaniu na strumien (np. konsole) wyliczonego srodowiska programu. Przy wypisywaniu srodowiska (bedacego slownikiem) nalezy posluzyc sie iteratorem. W wersji prostszej nalezy zbudowac drzewo programu liczacego uogolniona n-ta liczbe Fibonacciego. Oznacza to, ze parametrami programu sa: wartosc n oraz wartosci poczatkowe f0 oraz f1. Wielkosci te powinny byc reprezentowane przez zmienne programu i statycznie ustalone w pierwszych instrukcjach programu (drzewa). W wersji trudniejszej nalezy dodac wczytywanie srodowiska wejsciowego z pliku przed rozpoczeciem wyliczania programu i wypisywanie srodowiska wyjsciowego do pliku po zakonczeniu wyliczania programu. Mozna wybrac dowolny wygodny format pliku. Wartosci n oraz f0 i f1 nie nalezy ustalac statycznie na poczatku programu (drzewa) -- powinny byc inicjalizowane w srodowisku wejsciowym (pliku). 4. Uwagi: - Klasa Slownik moze byc zdefiniowana z wykorzystaniem STL (). - Nalezy zapewnic spojna obsluge bledow (niekoniecznie poprzez wyjatki). - Warto zauwazyc, ze zadanie jest rozszerzeniem przykladu z wyliczaniem drzewa wyrazen omawianego na wykladzie.