Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод_рекоменд-ТП-4.doc
Скачиваний:
3
Добавлен:
12.11.2019
Размер:
2.49 Mб
Скачать

1.6. Розширення мови sipl: Введення булевих змінних

1.6.1.

Синтаксис розширеної мови SIPL можна задати за допомогою наступної БНФ (див. Табл.1.4), доповнивши базову (див. п.1.1) новими правилами та розширивши існуючі з урахуванням нових конструкцій:

Таблиця 1.4.

Ліва частина правила –

метазмінна

(дефінієндум)

Права частина правила

(дефінієнс)

Ім’я

правила

<програма> ::=

begin <оператор> end

NP1

<оператор> ::=

<змінна_чис>:=<вираз_чис> |

<змінна_бул>:=<вираз_бул> |

<оператор> ; <оператор> |

if <вираз_бул> then <оператор> else <оператор> |

while <вираз_бул> do <оператор> |

begin <оператор> end |

skip

NS1

NS2

NS3

NS4

NS5

NS6

NS7

<вираз_чис> :=

<число> | <змінна_чис> |

<вираз_чис > + <вираз_чис > | <вираз_чис ><вираз_чис > | <вираз_чис > * <вираз_чис > | <вираз_чис > ÷ <вираз_чис > | (<вираз_чис>)

NA1_1

NA1_7

<вираз_бул> ::=

<бул> |<змінна_бул>|

<вираз_чис> < <вираз_чис>| <вираз_чис><вираз_чис> | <вираз_чис> = <вираз_чис> | <вираз_чис><вираз_чис> | <вираз_чис> > <вираз_чис> | <вираз_чис><вираз_чис> |

<вираз_бул> < <вираз_бул> |<вираз_бул><вираз_бул> | <вираз_бул> = <вираз_бул> | <вираз_бул><вираз_бул> | <вираз_бул> > <вираз_бул> | <вираз_бул><вираз_бул> |

<вираз_бул><вираз_бул> | <вираз_бул><вираз_бул> |  <вираз_бул>| (<вираз_бул>)

NA2_1

NA2_17

<змінна_чис> ::=

M | N | . . .

NV1–…

<змінна_бул> ::=

M_B | N_B | . . .

NV1–…

<число> ::=

. . . –1 | 0 | 1 | 2 | 3 | . . .

NN1–…

<бул> ::=

true |false

NB1-NB2

В даному випадку множину всіх виразів розділено на булеві та цілочисельні. Введемо позначення для всіх синтаксичних категорій та нові метазмінні, що вказують на представників цих категорій (див. Табл.1.5).

Таблиця 1.5.

Метазмінна

Синтаксична категорія

Нова метазмінна

<програма>

Prog

P

<оператор>

Stm

S

<вираз_чис>

Aexp

a

<вираз_бул>

Bexp

c

<змінна_чис>

Var

x

<змінна_бул>

Var_B

y

<число>

Num

n

<бул>

Bool

b

В наведених позначеннях БНФ мова SIPL набуває наступного вигляду (Табл.1.6):

Таблиця 1.6.

Ліва частина правила –

метазмінна

(дефінієндум)

Права частина правила

(дефінієнс)

Ім’я

правила

P ::=

begin S end

NP1

S ::=

x:=a|

y:=c|

S 1; S2|

if c then S1 else S2 |

while c do S |

begin S end |

skip

NS1

NS2

NS3

NS4

NS5

NS6

NS7

a :=

n | x |

a 1+ a2 | a1a2 | a1 * a2 | a1 ÷ a2 | (a)

NA1_1

NA1_7

c ::=

b |y|

a 1< a2| a1a2 | a1 = a2 | a1a2 | a1 > a2 | a1a2 |

c1 < c2 |c1c2 | c1 = c2 | c1c2 | c1 > c2 | c1c2 |

c1c2 | c1c2 |  c| (c)

NA2_1

NA2_17

x ::=

M | N | . . .

NV1–…

y ::=

M_b | N_b | . . .

NV1–…

n ::=

. . . –1 | 0 | 1 | 2 | 3 | . . .

NN1–…

b ::=

true |false

NB1-NB2

Надалі будемо користуватися введеними позначеннями для запису структури програм та їх складових.

Базові типи даних – множини цілих чисел, булевих значень та змінних (імен):

  • Int={ . . . , -2, -1, 0, 1, 2, . . . }

  • Bool={true, false}

  • Var={X,Y, … }

  • Var_B={X_B,Y_B, … }

Похідні типи – множина станів змінних (наборів іменованих значень, наборів змінних з їх значеннями):

  • State={VarInt,Var_B Bool}

Приклади станів змінних: [M8, N16], [M3, X4, Ytrue, Nfalse].

Операції на множині Int. Символам +, – , ,  відповідають операції add, sub, mult, div (додавання, віднімання, множення, ділення). Це бінарні операції типу Int2Int.

Операції на множині Bool. Символам , ,  відповідають операції or, and, neg. Це бінарні операції типу Bool2Bool (диз’юнкція та кон’юнкція) та унарна операція типу Bool Bool (заперечення).

В мові також є операції змішаного типу. Символам операцій порівняння <, , =, , , > відповідають операції less, leq, eq, neq, geq, gr. Це бінарні операції типу Int2  Bool.

Крім того, введемо

  • функцію-константу арифметичного типу : StateInt, таку що (st)=n,

  • функції-константи бульового типу , : StateBool такі, що (st)=true, (st)=false,

  • тотожну функцію id: StateState, таку, що id(st)=st.

Отримали багатоосновну алгебру даних мови SIPL

A_Int_Bool_State =<Int, Bool, State; add, sub, mult, div, or, and, neg,

less, leq, eq, neq, geq, gr,  x, x, y, y, , , id, , , >

Формули обчислення задаються аналогічно алгебрі A_Prog.

Нові правила побудови семантичного терму подано у табл.1.7:

Таблиця 1.7.

Правило заміни

Номер

правила

sem_P: ProgFS задається правилами:

sem_P(begin S end)= sem_S(S)

NS_Prog

sem_S: StmFS задається правилами:

sem_S(x:=a)=ASx(sem_A(a))

sem_S(y:=c)=ASy(sem_B(c))

sem_S(S1;S2)= sem_S(S1) sem_S(S2)

sem_S(if c then S1 else S2)= IF(sem_B(b), sem_S(S1), sem_S(S2))

sem_S(while c do S)= WH(sem_B(b), sem_S(S))

sem_S(begin S end)=(sem_S(S))

sem_S(skip)=id

NS_Stm_As

NS_Stm_As_B

NS_Stm_Seq

NS_Stm_If

NS_Stm_Wh

NS_Stm_BE

NS_Stm_skip

sem_A: AexpFA задається правилами:

sem_A(n))=

sem_A(x))=x

sem_A(a1+a2)=S2(add, sem_A(a1), sem_A(a2))

sem_A(a1a2)=S2(sub, sem_A(a1), sem_A(a2))

sem_A(a1a2)=S2(mult, sem_A(a1), sem_A(a2))

sem_A(a1a2)=S2(div, sem_A(a1), sem_A(a2))

sem_A((a))=sem_A(a)

NS_A_Num

NS_A_Var NS_A_Add

NS_A_Sub

NS_A_Mult

NS_A_Div

NS_A_Par

sem_B: BexpFB задається правилами:

sem_B(b)=

sem_B(y)=y

sem_B(a1<a2)=S2(less, sem_A(a1), sem_A(a2))

sem_B(a1a2)=S2(leq, sem_A(a1), sem_A(a2))

sem_B(a1=a2)=S2(eq, sem_A(a1), sem_A(a2))

sem_B(a1a2)=S2(neq, sem_A(a1), sem_A(a2))

sem_B(a1a2)=S2(geq, sem_A(a1), sem_A(a2))

sem_B(a1>a2)=S2(gr, sem_A(a1), sem_A(a2))

sem_B(c1<c2)=S2(less, sem_B(c1), sem_B(c2))

sem_B(c1c2)=S2(leq, sem_B(c1), sem_B(c2))

sem_B(c1=c2)=S2(eq, sem_B(c1), sem_B(c2))

sem_B(c1c2)=S2(neq, sem_B(c1), sem_B(c2))

sem_B(c1c2)=S2(geq, sem_B(c1), sem_B(c2))

sem_B(c1>c2)=S2(gr, sem_B(c1), sem_B(c2))

sem_B(c1c2)=S2(or, sem_B(c1), sem_B(c2))

sem_B(c1c2)=S2(and, sem_B(c1), sem_B(c2))

sem_B(c)=S1(neg, sem_B(c))

sem_B((c))= sem_B(c)

NS_B_Const

NS_B_Var

NS_B_less

NS_B_leq

NS_B_eq

NS_B_neq

NS_B_geq

NS_B_gr

NS_B_lessB

NS_B_leqB

NS_B_eqB

NS_B_neqB

NS_B_geqB

NS_B_grB

NS_B_or

NS_B_and

NS_B_neg

NS_B_Par