Metody realizacji języków programowania/MRJP Ćwiczenia 3: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
|||
Linia 33: | Linia 33: | ||
Przeprowadź analizę typów. | Przeprowadź analizę typów. | ||
'''Wskazówka''': Zgodnie z metodą przedstawioną w wykładzie | '''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, | # 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. | # zstępującej - idąc od korzenia do liści w każdym węźle określ jednoznacznie możliwy typ. | ||
Linia 50: | Linia 50: | ||
h : '''int''' -> K (wynikiem jest referencja do K) | h : '''int''' -> K (wynikiem jest referencja do K) | ||
Powiedz które z poniższych wyrażeń są L-wartościami: | Powiedz, które z poniższych wyrażeń są L-wartościami: | ||
f | f |
Aktualna wersja na dzień 14:11, 27 wrz 2006
Autor: 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