Semantyka i weryfikacja programów/Ćwiczenia 10

From Studia Informatyczne

Spis treści

Funkcje

Zadanie 1

Zdefiniuj semantykę denotacyjną następującego języka:

n \, ::= \,\, 0 \,\,|\,\, 1 \,\,|\,\, \ldots

x \, ::= \,\, \ldots \, (identyfikatory) \, \ldots

e \,  ::=  \,\,           n   \,\,|\,\,         x   \,\,|\,\,         e_1 + e_2 \,\,|\,\,         \mathbf{call}\, F (x)

b \,  ::=  \,\,           e_1 = e_2   \,\,|\,\,         \mathbf{not}\, b    \,\,|\,\,         b_1\, \mathbf{or}\, b_2

i \, ::= \,\,          x := e     \,\,|\,\,          i_1; i_2   \,\,|\,\,          \mathbf{if}\, b \,\mathbf{then}\, i_1 \,\mathbf{else}\, i_2 \,\,|\,\,          \mathbf{skip} \,\,|\,\,          \mathbf{while}\, b \,\mathbf{do}\, i \,\,|\,\,          \mathbf{begin}\, d; i\,\mathbf{end}

d \, ::= \,\,          \mathbf{var}\, x := e     \,\,|\,\,          d_1; d_2   \,\,|\,\,          \mathbf{fun}\, F (x); i\, \mathbf{endfun}

Deklaracja \mathbf{fun}\, F (x); i\, \mathbf{endfun} wprowadza funkcję o nazwie F z jednym parametrem x przekazywanym przez zmienną. Wykonanie funkcji polega na wykonaniu instrukcji i, która powinna zawierać przypisanie na identyfikator F. Takie przypisanie ustala wartość funkcji ale nie kończy wykonania instrukcji i.

Kontynuacje instrukcji

Zadanie 2

Powróćmy do języka TINY. Dodajmy do niego następujące instrukcje:

i \, ::= \,\,          x := e     \,\,|\,\,          i_1; i_2   \,\,|\,\,          \mathbf{if}\, b \,\mathbf{then}\, i_1 \,\mathbf{else}\, i_2 \,\,|\,\,          \mathbf{skip} \,\,|\,\,          \mathbf{abort} \,\,|\,\,          \mathbf{while}\, b \,\mathbf{do}\, i \,\,|\,\,          \mathbf{repeat}\, i\,\mathbf{until}\, b

Zdefiniuj semantykę kontynuacyjną powyższych instrukcji. Możesz przy tym korzystać z gotowych już funkcji semantycznych dla pozostałych kategorii (w semantyce bezpośredniej) syntaktycznych.

Zadanie 3

Rozszerz język z poprzedniego zadania o konstrukcje

i \, ::= \,\,          \mathbf{loop}\,  i\,\mathbf{endloop}  \,\,|\,\,          \mathbf{break} \,\,|\,\,          \mathbf{continue}


Zadanie 4

Uzupełnij definicję języka o bloki, deklaracje zmiennych i procedur oraz wywołanie procedury.

Zadanie 5

Zdefiniuj semantykę denotacyjną następującego języka:

n \, ::= \,\, 0 \,\,|\,\, 1 \,\,|\,\, \ldots

x \, ::= \,\, \ldots \, (identyfikatory) \, \ldots

e \,  ::=  \,\,           n   \,\,|\,\,         x   \,\,|\,\,         e_1 + e_2 \,\,|\,\,         \mathbf{call}\, F (x)

i \, ::= \,\,          x := e     \,\,|\,\,          i_1; i_2   \,\,|\,\,          \mathbf{skip} \,\,|\,\,          \mathbf{if}\, e_1 = e_2 \,\mathbf{then}\, i_1 \,\mathbf{else}\, i_2 \,\,|\,\,          \mathbf{break} \,\,|\,\,          \mathbf{rollback} \,\,|\,\,          \mathbf{again}

p \, ::= \,\,          \mathbf{begin}\, i \, \mathbf{end}

Program i instukcje postaci \mathbf{begin}\, i \, \mathbf{end} są blokami. Instrukcja break powoduje natychmiastowe wyjście z bloku i wznowienie wykonania od następnej instrukcji po bloku. Instrukcja again to skok do pierwszej instrukcji w najbardziej zagnieżdżonym bloku, w którym wystąpiła. Instrukcja rollback działa podobnie jak break, ale anuluje wszystkie zmiany dokonane od ostatniego wejścia do bloku, w którym wystąpiła.

Wykonanie programu:

 begin
   x := 2;
   begin
     x := x + 1;
     if x = 5 then rollback else again
   end
 end

zakończy się ze zmienną x równą 2. Choć środowiska wydają się tu niepotrzebne, spróbuj wykorzystać je do przechowywania pewnych potrzebnych informacji.