Semantyka i weryfikacja programów/Ćwiczenia 10

Z Studia Informatyczne
Wersja z dnia 22:13, 11 wrz 2023 autorstwa Luki (dyskusja | edycje) (Zastępowanie tekstu – „<math> ” na „<math>”)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacjiPrzejdź do wyszukiwania

Funkcje

Zadanie 1

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

n::=0|1|

x::=(identyfikatory)

e::=n|x|e1+e2|𝐜𝐚𝐥𝐥F(x)

b::=e1=e2|𝐧𝐨𝐭b|b1𝐨𝐫b2

i::=x:=e|i1;i2|𝐢𝐟b𝐭𝐡𝐞𝐧i1𝐞𝐥𝐬𝐞i2|𝐬𝐤𝐢𝐩|𝐰𝐡𝐢𝐥𝐞b𝐝𝐨i|𝐛𝐞𝐠𝐢𝐧d;i𝐞𝐧𝐝

d::=𝐯𝐚𝐫x:=e|d1;d2|𝐟𝐮𝐧F(x);i𝐞𝐧𝐝𝐟𝐮𝐧

Deklaracja 𝐟𝐮𝐧F(x);i𝐞𝐧𝐝𝐟𝐮𝐧 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|i1;i2|𝐢𝐟b𝐭𝐡𝐞𝐧i1𝐞𝐥𝐬𝐞i2|𝐬𝐤𝐢𝐩|𝐚𝐛𝐨𝐫𝐭|𝐰𝐡𝐢𝐥𝐞b𝐝𝐨i|𝐫𝐞𝐩𝐞𝐚𝐭i𝐮𝐧𝐭𝐢𝐥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::=𝐥𝐨𝐨𝐩i𝐞𝐧𝐝𝐥𝐨𝐨𝐩|𝐛𝐫𝐞𝐚𝐤|𝐜𝐨𝐧𝐭𝐢𝐧𝐮𝐞


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|

x::=(identyfikatory)

e::=n|x|e1+e2|𝐜𝐚𝐥𝐥F(x)

i::=x:=e|i1;i2|𝐬𝐤𝐢𝐩|𝐢𝐟e1=e2𝐭𝐡𝐞𝐧i1𝐞𝐥𝐬𝐞i2|𝐛𝐫𝐞𝐚𝐤|𝐫𝐨𝐥𝐥𝐛𝐚𝐜𝐤|𝐚𝐠𝐚𝐢𝐧

p::=𝐛𝐞𝐠𝐢𝐧i𝐞𝐧𝐝

Program i instukcje postaci 𝐛𝐞𝐠𝐢𝐧i𝐞𝐧𝐝 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.