Semantyka i weryfikacja programów/Ćwiczenia 12

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

Semantyka kontynuacyjna

Zadanie 1

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

n::=0|1|

x::=(identyfikatory)

e::=n|x|e1+e2

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

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

Znaczenie wszystkich konstrukcji z wyjątkiem Parser nie mógł rozpoznać (nieznana funkcja „\mathb”): {\displaystyle \mathbf{for}\, x = e_1\, \mathbf{to}\, e_2 \, \mathb{try}\, i_1\, \mathbf{else}\, i_2} oraz 𝐟𝐚𝐢𝐥 jest standardowe.

Znaczenie instrukcji 𝐟𝐨𝐫x=e1𝐭𝐨e2𝐭𝐫𝐲i1𝐞𝐥𝐬𝐞i2 jest następujące: najpierw jeden raz jest obliczana wartość wyrażenia e1 i podstawiana na zmienną x. Potem w pętli robimy co następuje: jeśli x>e2, to wykonujemy i2 w stanie sprzed instrukcji for (w szczególności wartość zmiennej x na początku wykonywania i2 powinna być przywrócona do tej sprzed wykonania instrukcji for) i przechodzimy do dalszej części programu. Natomiast jeśli xe2, to jest wykonywana instrukcja i1. Jeśli w i1 nie zostanie napotkana instrukcja fail, to przywracamy starą wartość zmiennej x (tę sprzed wykonania instrukcji for) i przechodzimy do dalszej części programu. Jeśli jednak napotkamy fail, to przywracamy stan sprzed wykonania instrukcji for (zachowując oczywiście wartość zmiennej x), zwiększamy wartość zmiennej x o 1 i powtarzamy procedurę opisaną powyżej.

Instrukcja fail poza instrukcją for powinna powodować natychmiastowe zakończenie wykonywania programu. Jeśli fail występuję po else, czyli w i2, to odnosi się ono do (być może nieistniejącej) zewnętrznej pętli for.

Zadanie 2

Oto pewien śmieszny język programowania:

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

Programy w tym języku mogą wykonywać się w dwie strony: od lewej do prawej oraz od prawej do lewej. Wykonanie rozpoczyna się od pierwszej instrukcji i przebiega od lewej do prawej. Instrukcja back powoduje zmianę kierunku wykonania. Instrukcja left i powoduje wykonanie i jeśli wykonanie przebiega od prawej do lewej, w przeciwnym razie jest to instrukcja pusta. Symetrycznie działa right. Napisz semantykę tego języka.