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 (<map.h>).
- Nalezy zapewnic spojna obsluge bledow (niekoniecznie poprzez wyjatki).
- Warto zauwazyc, ze zadanie jest rozszerzeniem przykladu z wyliczaniem drzewa
  wyrazen omawianego na wykladzie.