• Nie Znaleziono Wyników

SEMANTYKA I WERYFIKACJA - Zadanie egzaminacyjne nr 1

N/A
N/A
Protected

Academic year: 2021

Share "SEMANTYKA I WERYFIKACJA - Zadanie egzaminacyjne nr 1"

Copied!
3
0
0

Pełen tekst

(1)

SEMANTYKA I WERYFIKACJA - Zadanie egzaminacyjne nr 1

Napisz semantykę operacyjną dużych kroków języka o następującej grama- tyce:

N um 3 n ::= 0 | 1 | −1 | 2 | −2 | · · · V ar 3 x ::= x | y | · · ·

XN ame 3 w ::= w | v | · · ·

Expr 3 e ::= n | x | e1+ e2| e1∗ e2| e1− e2

BExpr 3 b ::= true | false | e1< e2| e1= e2| b1∨ b2| not b | thrown w(e) Decl 3 d ::= var x := e | d1; d2

Instr 3 I ::= skip | x := e | I1; I2| if b then I1 else I2| while b do I | begin d; I end | try I1 catch w(e) I2

Jest to język z wyjątkami, które mają argumenty liczbowe (wagi) oraz są podnoszone jedynie wtedy, kiedy wiadomo że będą obsłużone.

Instrukcja try I1 catch w(e) I2 rozpoczyna się od obliczenia wartości wy- rażenia e. Następnie wykonuje się instrukcja I1, przy czym deklaruje się w niej, że wyjątek w podniesiony z wagą mniejszą lub równą obliczonej na wstępie war- tości e będzie obsłużony instrukcją I2. Wyjątki o innych nazwach, oraz wyjątki w z większymi wagami, nie są przez tę instrukcję przechwytywane.

Wyrażenie logiczne thrown w(e) podnosi wyjątek w z wagą równą wartości wyrażenia arytmetycznego e, ale tylko jeśli ten wyjątek będzie gdzieś przechwy- cony. Jeżeli nie ma żadnej zadeklarowanej metody obsługi tego wyjątku o tej (lub większej) wadze, to wyjątek nie jest podnoszony a wyrażenie zwraca war- tość false.

Pozostałe konstrukcje mają standardową semantykę.

Na przykład po wykonaniu fragmentu programu x := 0; y := 10;

try

while not (thrown w(y)) do x := x+1; y := y-1 catch w(y-9) x := x+1

zmienna x ma wartość 10, a zmienna y wartość 1.

1

(2)

ROZWIĄZANIE:

Dziedziny semantyczne (funkcje są częściowe bez ostrzeżenia):

s ∈ Store = Loc → Num ρ ∈ Env = Var → Loc χ ∈ XEnv = XName → Num Ogólne postaci stwierdzeń semantycznych:

ρ ` e, s → n wyrażenia arytmetyczne χ, ρ ` b, s → {tt , ff } wyrażenia logiczne χ, ρ ` b, s → w, n

χ, ρ ` I, s → s0 instrukcje χ, ρ ` I, s → s0, w, n instrukcje d, ρ, s → ρ0, s0 deklaracje

Reguły dla wyrażeń arytmetycznych są standardowe.

Reguły dla wyrażeń logicznych są standardowe, poza tymi dla wyrażenia thrown. Poza tym trzeba opisać proces propagacji wyjątków i określić kolejność obliczania binarnych wyrażeń logicznych.

ρ ` true, s → tt ρ ` false, s → ff ρ ` e1, s → n1 ρ ` e2, s → n2 n1< n2

χ, ρ ` e1< e2, s → tt

ρ ` e1, s → n1 ρ ` e2, s → n2 n1≥ n2

χ, ρ ` e1< e2, s → ff ρ ` e1, s → n1 ρ ` e2, s → n2 n1= n2

χ, ρ ` e1= e2, s → tt

ρ ` e1, s → n1 ρ ` e2, s → n2 n16= n2 χ, ρ ` e1= e2, s → ff

χ, ρ ` b → tt χ, ρ ` not b → ff

χ, ρ ` b → ff χ, ρ ` not b → tt

χ, ρ ` b → w, n χ, ρ ` not b → w, n χ, ρ ` b1, s → tt χ, ρ ` b2, s → tt

χ, ρ ` b1∨ b2, s → tt

χ, ρ ` b1, s → tt χ, ρ ` b2, s → ff χ, ρ ` b1∨ b2, s → tt χ, ρ ` b1, s → ff χ, ρ ` b2, s → tt

χ, ρ ` b1∨ b2, s → tt

χ, ρ ` b1, s → ff χ, ρ ` b2, s → ff χ, ρ ` b1∨ b2, s → ff χ, ρ ` b1, s → tt χ, ρ ` b2, s → w, n

χ, ρ ` b1∨ b2, s → w, n

χ, ρ ` b1, s → ff χ, ρ ` b2, s → w, n χ, ρ ` b1∨ b2, s → w, n χ, ρ ` b1, s → w, n

χ, ρ ` b1∨ b2, s → w, n ρ ` e, s → n χ(n) ≥ n

χ, ρ ` thrown w(e) → w, n

ρ ` e, s → n undef(χ(n)) χ, ρ ` thrown w(e) → ff

ρ ` e, s → n χ(n) < n χ, ρ ` thrown w(e) → ff Reguły dla instrukcji: wszystkie są standardowe poza tymi dla instrukcji

try-catch. Trzeba też zdefiniować reguły propagowania wyjątków.

2

(3)

Poniżej zmienna θ przebiega zarówno po stanach s jak i po trójkach s, w, n.

χ, ρ ` skip, s → s ρ ` e, s → n

χ, ρ ` x := e, s → s[ρ(x) 7→ n]

χ, ρ ` I1, s → s0 χ, ρ ` I2, s0→ θ χ, ρ ` I1; I2, s → θ

χ, ρ ` I1, s → s0, w, n χ, ρ ` I1; I2, s → s0, w, n χ, ρ ` b, s → tt χ, ρ ` I1, s → θ

χ, ρ ` if b then I1else I2, s → θ χ, ρ ` b, s → ff χ, ρ ` I2, s → θ χ, ρ ` if b then I1else I2, s → θ

χ, ρ ` b, s → w, n

χ, ρ ` if b then I1 else I2, s → s, w, n

χ, ρ ` b, s → tt χ, ρ ` I, s → s0 χ, ρ ` while b do I, s0 → θ χ, ρ ` while b do I, s → θ

χ, ρ ` b, s → tt χ, ρ ` I, s → s0, w, n χ, ρ ` while b do I, s → s0, w, n

χ, ρ ` b, s → w, n χ, ρ ` while b do I, s → s, w, n χ, ρ ` b, s → ff

χ, ρ ` while b do I, s → s d, ρ, π, s → ρ0, π0, s0 χ, ρ0 ` I, s0 → θ

χ, ρ ` begin d; I end, s → θ

Wszędzie poniżej, χ0=

 χ[w 7→ n] jeśli undef(χ(w)) lub χ(w) > n χ wpp.

ρ ` e, s → n χ0, ρ ` I1, s → s0 χ, ρ ` try I1catch w(e) I2, s → s0

ρ ` e, s → n χ0, ρ ` I1, s → v, m s0, v 6= w χ, ρ ` try I1 catch w(e) I2, s → s0, v, m ρ ` e, s → n χ0, ρ ` I1, s → s0, w, m m > n

χ, ρ ` try I1 catch w(e) I2, s → s0, w, m

ρ ` e, s → n χ0, ρ ` I1, s → s0, w, m m ≤ n χ, ρ ` I2, s0→ θ χ, ρ ` try I1 catch w(e) I2, s → θ

Reguły dla deklaracji są standardowe.

3

Cytaty