Semantyka i weryfikacja programów/Ćwiczenia 3: Różnice pomiędzy wersjami
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 186: | Linia 186: | ||
==== Rozwiązanie (szkic) ==== | ==== Rozwiązanie (szkic) ==== | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | |||
Dopóki nie wystąpi błąd dzielenia przez zero, semantyka programu | Dopóki nie wystąpi błąd dzielenia przez zero, semantyka programu | ||
Linia 275: | Linia 277: | ||
</math> | </math> | ||
</div></div> | |||
Linia 298: | Linia 301: | ||
==== Rozwiązanie 1 (semantyka naturalna) ==== | ==== Rozwiązanie 1 (semantyka naturalna) ==== | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | |||
Dodamy do reguł semantyki naturalnej dla języka Tiny | Dodamy do reguł semantyki naturalnej dla języka Tiny | ||
Linia 419: | Linia 424: | ||
Zauważmy, że nasze reguły nie pozwalają na dodanie drugiego | Zauważmy, że nasze reguły nie pozwalają na dodanie drugiego | ||
(kolejnego) śladu! | (kolejnego) śladu! | ||
</div></div> | |||
==== Rozwiązanie 2 (małe kroki) ==== | ==== Rozwiązanie 2 (małe kroki) ==== | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | |||
W semantyce naturalnej musieliśmy napisać wiele reguł aby | W semantyce naturalnej musieliśmy napisać wiele reguł aby | ||
Linia 552: | Linia 562: | ||
\{ \mbox{było-}\mathbf{exit}, \mbox{było-}\mathbf{continue} \}. | \{ \mbox{było-}\mathbf{exit}, \mbox{było-}\mathbf{continue} \}. | ||
</math> | </math> | ||
</div></div> | |||
Wersja z 08:32, 7 sie 2006
Zawartość
Kończymy semantykę małych kroków i rozpoczynamy semantykę naturalną (duże kroki). Uzupełnimy semantykę naturalną języka Tiny o semantykę naturalną dla wyrażeń boolowskich i arytmetycznych i semantykę dla błędów wykonania. Wreszcie dodamy instrukcję pętli i instrukcje niestrukturalnego zakończenia pętli (instrukcje i ).
Rozszerzenia semantyki języka Tiny
Zadanie 1
Zdefiniuj znaczenie wyrażeń boolowskich i arytmetycznych w języku Tiny, w stylu dużych kroków (semantyka naturalna).
Rozwiązanie
Zadanie 2
Rozważ dodatkowo operację dzielenia:
i rozszerz semantykę z poprzedniego zadania. Dzielenie przez zero jest błądem i kończy natychmiast wykonanie programu. Oprócz stanu wynikiem programu powinna byc informacja o błędzie, jeśli błąd wystąpił.
Rozwiązanie (szkic)
Zadanie 3
Rozszerz język Tiny o następującą instrukcję pętli:
to instrukcja pętli, stanowi instrukcję wewnętrzną. Instrukcja wychodzi z nabliższej pętli i kontynuuje wykonanie programu od pierwszej instrukcji za tą pętlą. Instrukcje powraca na początek instrukcji wewnętrznej najbliższej pętli.
Pozważ zarówno semantykę naturalną jak i semantykę małych kroków.
Rozwiązanie 1 (semantyka naturalna)
Rozwiązanie 2 (małe kroki)
Zadania domowe
Zadanie 1
Zaproponuj semantykę mało-krokową języka z zdania 2. Czy różni się ona istotnie od semantyki naturalnej?
Zadanie 2
Napisz semantyję naturalną dla nieznacznie rozszerzonej wersji instrukcji :
Identyfikator pełni tutaj rolę etykiety przypisanej instrukcji , jest też parametrem dwóch pozostałych instrukcji. kończy teraz najbliższą otaczającą pętlę o etykiecie . Podobnie wznawia najbliższą pętlę o etykiecie . Np. program
Parser nie mógł rozpoznać (błąd składni): {\displaystyle x: \mathbf{loop}\,\\ \quad \quad a := 1; \quad \quad y: \mathbf{loop}\, \quad \quad \quad \quad \mathbf{exit} x; \quad \quad \quad \quad a := a-10; \quad \quad a := a+1; a := a+2; }
kończy działanie z wartością zmiennej . Zauważmy, że musieliśmy jakoś określić, do wnętrza której pętli należą trzy ostatnie instrukcje. Użyliśmy to tego celu wcięć a niejednoznaczność bierze się oczywiście stąd, że pracujemy ze składnią abstrakcyjną. Składnia konkretna zawierałaby prawdopodobnie jakąś konstukcję zamykającą pętlę , np. .
Zadanie 3
Napisz semantykę naturalną i mało-krokową dla rozszerzenia języka Tiny o wyrażenia z efektami ubocznymi:
Obliczenie wyrażenia polega na wykonaniu a potem na obliczeniu . Wartość wyrażenia jest taka jak wartość wyrażenia a efektem ubocznym jest podstawienie tej wartości na zmienną .