Semantyka i weryfikacja programów/Ćwiczenia 11

Z Studia Informatyczne
Wersja z dnia 22:18, 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

Semantyka w pełni kontynuacyjna

Zadanie 1

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

n::=0|1|

x::=(identyfikatory)

e::=n|x|e1+e2|b?e2:e3

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

Parser nie mógł rozpoznać (błąd składni): {\displaystyle 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 \,\,|\,\} ,

Wyrażenie b?e1:e2 to wyrażenie warunkowe. Wylicza się go wyliczając najpierw b. Jeśli wyliczy się ono do prawdy, to wartością całego wyrażenia jest wartość wyrażenia e1, a w przeciwnym razie wartość wyrażenia e2.

Zadanie 2

Tym razem większy przykład. Spróbujemy zdefiniować semantykę języka wzorowanego "nieco" na języku programowania C. Oto składnia:

n::=1,0|1|

x::=(identyfikatory)

Parser nie mógł rozpoznać (błąd składni): {\displaystyle l \, ::= \,\, x \,\,|\,\, x [e] \,\,|\,\} ,

e::=n|l|e1+e2|b?e2:e3|l++|++l|l=e|l+=e|𝐜𝐚𝐥𝐥F(e)

i::=e|i1;i2|𝐢𝐟(e)i|𝐬𝐤𝐢𝐩|𝐰𝐡𝐢𝐥𝐞(e)i|𝐟𝐨𝐫(i1;e;i2)i3|𝐛𝐫𝐞𝐚𝐤|𝐜𝐨𝐧𝐭𝐢𝐧𝐮𝐞|𝐫𝐞𝐭𝐮𝐫𝐧e|{d;i}

d::=𝐯𝐚𝐫x|𝐚𝐫𝐫𝐚𝐲x[e]|d1;d2

Zadanie 3

Zmień semantykę powyższego języka tak, aby przekazywanie parametrów odbywało się przez nazwę.

Zadanie 4

Zmień semantykę powyższego języka tak, aby przekazywanie parametrów odbywało się metodą copy-in copy-out.