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 |
Nie podano opisu zmian |
||
(Nie pokazano 4 wersji utworzonych przez 2 użytkowników) | |||
Linia 1: | Linia 1: | ||
== Zadanie - sprawdzanie typów == | Autor: Marek Biskup (mbiskup@mimuw.edu.pl) | ||
== Zadanie 1 - sprawdzanie typów == | |||
Dana jest tablica symboli: | Dana jest tablica symboli: | ||
Linia 8: | Linia 10: | ||
print: '''string''' -> '''void''' | print: '''string''' -> '''void''' | ||
Narysuj drzewo | Narysuj drzewo składniowe dla fragmentu kodu źródłowego | ||
print( g( f( 1, a ) ) ); | print( g( f( 1, a ) ) ); | ||
Linia 25: | Linia 27: | ||
h : '''string''', '''double''' -> '''int''' | h : '''string''', '''double''' -> '''int''' | ||
Narysuj drzewo | Narysuj drzewo składniowe dla fragmentu kodu źródłowego: | ||
h ( g( f(5), 8) | h ( g( f(5), 8) | ||
Linia 31: | 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 48: | 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