Metody realizacji języków programowania/MRJP Ćwiczenia 3

From Studia Informatyczne

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:

  1. wstępującej - idąc od liści do korzenia w każdym węźle wylicz listę możliwe typy,
  2. 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