Metody realizacji języków programowania/MRJP Ćwiczenia 3
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwaniaAutor: Marek Biskup (mbiskup@mimuw.edu.pl)
Zadanie 1 - sprawdzanie typów
Dana jest tablica symboli:
f : int -> double a : int g : double, int -> string print: string -> void
Narysuj drzewo składniowe dla fragmentu kodu źródłowego
print( g( f( 1, a ) ) );
Określ typ każdego węzła.
Zadanie 2 - przeciążanie funkcji
Dana jest tablica symboli:
f : int -> string f : int -> double g : double -> string g : string -> void h : string, double -> int
Narysuj drzewo składniowe dla fragmentu kodu źródłowego:
h ( g( f(5), 8)
Przeprowadź analizę typów.
Wskazówka: Zgodnie z metodą przedstawioną w wykładzie analiza typów w przypadku przeciążania zwracanej wartości funkcji zachodzi w dwóch fazach:
- wstępującej - idąc od liści do korzenia w każdym węźle wylicz listę możliwe typy,
- zstępującej - idąc od korzenia do liści w każdym węźle określ jednoznacznie możliwy typ.
Zadanie 3 - L-wartości
Fragment tablicy symboli kompilatora to
f : int -> void g : int -> int t : referencja (wskaźnik) do tablicy intów i : int d : double r : referencja do obiektu klasy K, zawierającej a : int h : int -> K (wynikiem jest referencja do K)
Powiedz, które z poniższych wyrażeń są L-wartościami:
f g t i d f(1) g(1) t[1] t[g(1)] i + 5 t[t[g(1)] + 5] r r.a r.h(1) r.h(1).a