Download as pdf or txt
Download as pdf or txt
You are on page 1of 19

Матерiали до виконання

лабораторної роботи № 4 (частина 2)


Трансляцiя у ПОЛIЗ та виконання
програм з iнструкцiями
Юрiй Стативка
Квiтень. 2022 р.

Змiст
Вступ 2
Мотивацiйний приклад . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Необхiднi програми та данi . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1 Схема трансляцiї у ПОЛIЗ 3


1.1 Мiтка та оператор colon . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Оператор безумовного переходу goto . . . . . . . . . . . . . . . . . 4
1.3 Postfix-iнструкцiя умовного переходу JF . . . . . . . . . . . . . . . 6
1.4 Оператор розгалуження if . . . . . . . . . . . . . . . . . . . . . . . 6
1.5 Оператор циклу for . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.6 Оператори введення-виведення . . . . . . . . . . . . . . . . . . . . 11
1.7 Загальна схема трансляцiї . . . . . . . . . . . . . . . . . . . . . . . 12

2 Програмна реалiзацiя транслятора 12


2.1 Загальнi положення . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2 Код функцiй . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2.1 parseStatement() . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2.2 parseIf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2.3 createLabel() . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.4 setValLabe() . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.2.5 parseBoolExpr() . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.3 Трансляцiя програм з розгалуженням . . . . . . . . . . . . . . . . 16

3 Про звiт 18
3.1 Форма та структура звiту . . . . . . . . . . . . . . . . . . . . . . . . 18

Лiтература 19

1
Змiст До лабораторної роботи № 4 ( 2)

Вступ
Розглядаються методи трансляцiї у ПОЛIЗ iнструкцiй розгалуження IfStatement,
циклу ForStatement i введення-виведення InpStatement та OutStatement вiд-
повiдно. Наводиться програмний код розширення транслятора, створеного у по-
переднiй лабораторнiй роботi, для опрацювання iнструкцiй розгалуження. Код
прикладу транслятора – додається, системи часу виконання – НЕ додається.
Тi, хто вже зрозумiли як виконати це завдання чи вже виконали його, мо-
жуть тiльки переглянути вимоги до оформлення звiту у роздiлi 3 .
Мета лабораторної роботи – програмна реалiзацiя транслятора у ПОЛIЗ та
системи часу виконання ПОЛIЗ-програми з усiма синтаксичними конструкцiями
розробленої мови програмування.

Мотивацiйний приклад
Для з’ясування шляхiв розширення транслятора у ПОЛIЗ розглянемо при-
клад програми, написаної певною вхiдною мовою:
1 program
2 read ( a )
3 m2 :
4 read ( b , h )
5 goto m1
6 h := 2
7 m1 : h := 1
8 i f a < b then v1 := ( a + b ) / h
9 e l s e v1 := ( a + b )∗ h
10 endif
11 f o r i := a+1 s t e p h/2 t o ( a+b ) /2 do
12 h := v1 / i
13 w r i t e ( a+b , h , i )
14 endfor
15 end
Бачимо, що необхiдно розширити транслятор у ПОЛIЗ для таких констру-
кцiй:
1. Iдентифiкатор (оператор) мiтки з наступною двокрапкою як точка вхо-
дження в потоцi виконання, рядки 3 – m2: та 7 – m1:.
2. Iнструкцiя (оператор) безумовного переходу goto з наступним iдентифi-
катором мiтки, рядок 5.
3. Iнструкцiя (оператор) розгалуження, вважатимемо її вiдповiдною нетер-
мiналу IfStatement, рядки 8 – 10. Зауважимо, що її семантика потребує
засобiв оцiнки значення логiчного виразу та умовного переходу.
4. Iнструкцiя (оператор) циклу, вважатимемо, що вона вiдповiдає нетермi-
налу ForStatement, рядки 11 – 14.

2 StatusDoc=Draft
До лабораторної роботи № 4 ( 2)

5. Iнструкцiї (оператори) введення та виведення значень одного чи списку


елементiв, рядки 2 – read(a), 4 – read(b,z) та 13 – write(a+b,h,i).

Звичайно, вхiдна мова не обов’язково мiстить оператор goto та мiтки, тож


першi два пункти актуальнi не для всiх завдань.

Необхiднi програми та данi


Для виконання роботи потрiбнi:

1. Граматика мови.

2. Специфiкацiя розробленої вхiдної мови.

3. Лексичний аналiзатор.

4. Транслятор для роботи з арифметикою та присвоюванням [3].

5. Приклади програм для тестування транслятора.

Розглянутий далi приклад можна знайти у тецi postfixIF_translator.

1 Схема трансляцiї у ПОЛIЗ


Розглянемо можливi пiдходи до трансляцiї окремих синтаксичних констру-
кцiй1 , врахувуючи їх семантику та з метою з’ясування загальної схеми2 .

1.1 Мiтка та оператор colon


Розпiзнавання мiтки може бути здiйснене як на рiвнi лексичному, так i на
синтаксичному за правилом, напр. Мiтка = IдентМiтки ’:’ з вiдповiдними се-
мантичними процедурами. Проте бажано зберiгати їх у таблицi розбору двома
окремими рядками, а IдентМiтки заносити до таблицi мiток, як це буде пока-
зано далi.
При трансляцiї конструкцiї m1:, якщо цiльова мова мiстить мiтки та ко-
манди переходу на них, вважаємо, що : – оператор, аргументом якого є мiтка
(iдентифiкатор) m1. Зауважимо, що вiн – унарний постфiксний оператор, тобто,
як i факторiал, вiн вже у постфiкснiй формi,див. Табл. 1, (тут ми не надавали
оператору : нового позначення):
Семантичнi процедури при трансляiї оператора : такi: 1) додавання мi-
тки до ПОЛIЗу (разом iз токеном), 2) додавання до ПОЛIЗу оператора : (разом
iз токеном) i 3) оброблення таблицi мiток (додати значення мiтки, значення мi-
тки – це номер, пiд яким вона зберiгається перед двокрапкою у ПОЛIЗ-кодi).

1
Пам’ятаємо, що [2] мiстить приклади трансляцiї великої кiлькостi рiзноманiтних синта-
ксичних конструкцiй
2
Про термiнологiю див. Зауваження на стор. 8

3 StatusDoc=Draft
1.2 Оператор безумовного переходу goto До лабораторної роботи № 4 ( 2)

№ Оператор Вираз Постфiксна форма


1 Постфiксний 5! 5 FACT
2 Постфiксний m1 : m1 :

Табл. 1: Приклади запису постфiксних операторiв

Наприклад, розбiр та трансляцiя програми


1 program
2 m5 :
3 m2 :
4 end

дають такий результат:


Таблиця символiв
numRec numLine lexeme token index
1 1 program keyword
2 2 m5 label
3 2 : colon
4 3 m2 label
5 3 : colon
6 4 end keyword

Таблиця iдентифiкаторiв
Ident Type Value Index

Таблиця констант
Const Type Value Index

Таблиця мiток
Label Value
m5 0
m2 2

Код програми у постфiкснiй формi (ПОЛIЗ):


[(’m5’, ’label’), (’:’, ’colon’), (’m2’, ’label’), (’:’, ’colon’)]

1.2 Оператор безумовного переходу goto


Унарний префiксний оператор у постфiкс–кодi теж записується пiсля свого
аргументу, як у Табл. 2:
На рiвнi iнструкцiй ПОЛIЗу застосуємо лексему JUMP з токеном jump. Роз-
робник вiльний у виборi вiдповiдних лексем, так у [2] використовується БП –
вiд Безумовний Перехiд.Для нас важливо, що лексеми JUMP та goto мають то-
тожну семантику, але у мовах промiжного та високого рiвня вiдповiдно, i при
використаннi не потребуюють додаткових уточнень.

4 StatusDoc=Draft
1.2 Оператор безумовного переходу goto До лабораторної роботи № 4 ( 2)

№ Оператор Вираз Постфiксна форма


1 Префiксний -9 9 NEG
2 Префiксний goto m1 m1 JUMP

Табл. 2: Приклади запису префiксних операторiв

Семантичнi процедури при трансляiї оператора goto зводяться до запису у


таблицю розбору та внесення до ПОЛIЗ-коду.
У мовах з динамiчною типiзацiєю лексичний аналiзатор, позбавлений зв’язку
з парсером, може обробити iдентифiкатор мiтки як iдентифiкатор та зробити
вiдповiднi записи у таблицi розбору та таблицi iдентифiкаторiв (а не таблицi
мiток). У такому випадку вказанi недолiки мають бути скоригованi на етапi
синтаксичного розбору. Наступний приклад демонстує таку ситуацiю для про-
грами
1 program
2 m2 :
3 goto m1
4 goto m2
5 m1 :
6 end

Таблиця символiв
numRec numLine lexeme token index
1 1 program keyword
2 2 m2 label
3 2 : colon
4 3 goto keyword
5 3 m1 ident 1
6 4 goto keyword
7 4 m2 ident 2
8 5 m1 label
9 5 : colon
10 6 end keyword

Таблиця iдентифiкаторiв
Ident Type Value Index
m1 type_undef val_undef 1
m2 type_undef val_undef 2

Таблиця констант
Const Type Value Index

5 StatusDoc=Draft
1.3 Postfix-iнструкцiя умовного переходу JF До лабораторної роботи № 4 ( 2)

Таблиця мiток
Label Value
m2 0
m1 6

Код програми у постфiкснiй формi (ПОЛIЗ):


[(’m2’, ’label’), (’:’, ’colon’), (’m1’, ’ident’), (’JUMP’, ’jump’),
(’m2’, ’ident’), (’JUMP’, ’jump’), (’m1’, ’label’), (’:’, ’colon’)]

В такiй ситуацiї, пiсля лексичного аналiзу, можна пiти одним зi шляхiв:

1. видалити з таблицi iдентифiкаторiв записи з лексемами iдентифiкаторами-


мiтками; в таблицi розбору замiнити записи типу
5:(3, ’m1’, ’ident’,1 на 5:(3, ’m1’, ’label’,”.

2. Видалити з таблицi iдентифiкаторiв записи з лексемами iдентифiкаторами-


мiтками; в таблицi розбору залишити записи як є, але при iнтерпретацiї
(’JUMP’,’jump’) iгнорувати токен ’ident’ лексеми на вершинi стека.

3. Запропонувати iнший спосiб.

1.3 Postfix-iнструкцiя умовного переходу JF


Мови промiжного та низького рiвня мiстять команди умовного переходу на
мiтку. Тут буде використовуватись постфiксна команда у формi
BoolExpr Label JF, яка здiйснює перехiд на мiтку Label тiльки у випадку,
якщо BoolExpr має значення false. У формi таблицi фрагмент postfix-коду
можна представити так (нижнiй рядок – адреси/номери елементiв програми
у постфiкснiй нотацiї): Якщо в результатi виконання iнструкцiї <, номер 2, на

a x < m1 JF ... ... m1 : ...


0 1 2 3 4 5 ... n n+1 n+2

стек буде покладено false, то команда JF здiйснить перехiд по мiтцi m1 , тоб-


то наступною встановить команду з номером n. Iнакше команда JF наступною
встановить iнструкцiю з номером 5.

1.4 Оператор розгалуження if


Оператор розгалуження у граматицi представлений правилом для нетермi-
нала IfStatement

IfStatement = if BoolExpression
then StatementList1
else StatementList2
endif

6 StatusDoc=Draft
1.4 Оператор розгалуження if До лабораторної роботи № 4 ( 2)

Для зручностi графiчного представлення перепишемо його з очевидними по-


значеннями (скороченими)

IfStatement = if BoolExpr then SL1 else SL2 endif

Для з’ясування способу трансляцiї у ПОЛIЗ розглянемо блок-схему опера-


тора та розставимо мiтки, наприклад так, як на Рис. 1. Семантика оператора
очевидна:

1. Якщо BoolExpr має значення False, то перейти на мiтку m1 , потiм вико-


нати SL2, потiм перейти на m2 .

2. Якщо BoolExpr має значення True, то виконати SL1, потiм перейти на m2 .

true false
BoolExpr
m1 :

SL1 SL2

m2 :

Рис. 1: Блок-схема оператора if

За допомогою ПОЛIЗ-iнструкцiй умовного та безумовного переходу схема-


тично це можна представити, як у Табл. 3.

ПОЛIЗ(BoolExpr) m1 JF SL1 m2 JUMP m1 : SL2 m2 : ...


... n n+1 n+2 n+3 n+4 n+5 n+6 n+7 n+8 n+9 n+10 n+11

Табл. 3: Схема постфiкс-коду оператора if

Отже, якщо BoolExpr має значення false, то за iнструкцiєю JF перейти на


мiтку m1 з номером n+6 (виконання iнструкцiй n+6 та n+7 означають просто
перехiд до iнструкцiї з номером, на одиницю бiльшим , тобто до n+7 та n+8
вiдповiдно), потiм виконати SL2, далi – мiтка m2 .
Якщо ж BoolExpr має значення true, то iнструкцiя JF не спрацьовує, далi
виконується SL1, потiм безумовний перехiд JUMP, iнструкцiя n+5, передає управ-
лiння на m2 – iнструкцiю з номером n+9.
З порiвняння структури оператора if вхiдною та постфiксною мовами отри-
маємо схему трансляцiї, див. Рис. 2.

7 StatusDoc=Draft
1.5 Оператор циклу for До лабораторної роботи № 4 ( 2)

if BoolExpr then SL1 else SL2 endif

ПОЛIЗ(BoolExpr) m1 JF ПОЛIЗ(SL1) m2 JMP m1 : ПОЛIЗ(SL2) m2 :

Рис. 2: Схема трансляцiї оператора if

Iншими словами, схема трансляцiї розглянутого тут оператора if полягає


в таких дiях:

1. Нiчого не робити, коли зустрiлась лексема if.

2. Виконати трансляцiю у постфiксну форму логiчного виразу BoolExpr.

3. Зустрiвши лексему then – згенерувати нову мiтку, хай це буде m1 ; додати


до ПОЛIЗу m1 JF.

4. Виконати трансляцiю у постфiксну форму списку операторiв SL1.

5. Зустрiвши лексему else – згенерувати нову мiтку, хай це буде m2 ; додати


до ПОЛIЗу m2 JMP m1 :.
Виконати семантичнi процедури оператора colon, див. роздiл 1.1.

6. Виконати трансляцiю у постфiксну форму списку операторiв SL2.

7. Зустрiвши лексему endif – додати до ПОЛIЗу m2 :.


Виконати семантичнi процедури оператора colon, див. роздiл 1.1.

Зауваження. Схема трансляцiї (синтаксично керована) визначається в [1,


розд. 2.3 та 5.4] як граматика з прикрiпленими до продукцiй (правил) про-
грамних фрагментiв. Самi фрагменти називаються також дiями, а у випадку
атрибутивних граматик – семантичними правилами.
В цьому текстi термiн схема трансляцiї означає також графiчне та/або сло-
весне представлення процесу аналiзу–синтезу, який забезпечує трансляцiю з
вхiдної мови на цiльову (ПОЛIЗ). Такi термiни як дiя, семантична процедура,
семантичне правило тощо вважаються тут синонiмами.

1.5 Оператор циклу for


Розглянемо трансляцiю оператора циклу такої структури:

for Prm := StartExpr step StepExpr to TargExpr do


StatementList
endfor

Вважаючи позначення очевидними, розглянемо його семантику:

1. На першiй iтерацiї параметру циклу Prm присвоїти значення виразу StartExpr.

8 StatusDoc=Draft
1.5 Оператор циклу for До лабораторної роботи № 4 ( 2)

2. Обчислити значення StepExpr. Але якщо це перша iтерацiя, то iгнорувати


його, iнакше збiльшити параметр циклу Prm на значення кроку StepExpr,
тобто Prm := Prm + StartExpr.

3. Перевiрити, що значення параметра циклу знаходиться в iнтервалi мiж


StartExpr та TargExpr. Якщо це так, то виконати тiло циклу StatementList
та перейти до обчислення StepExpr, п. 2, iнакше вийти з циклу.

Позначивши ознаку першої/непершої iтерацiї як r1, значення 1 i 0 вiдповiд-


но, та змiнну для зберiгання значення StepExpr як r2, побудуємо блок-схему,
встановивши мiтки для переходiв, див. Рис. 1.5.
Тодi схема трансляцiї та вiдповiднi семантичнi процедури, можуть бути пред-
ставленi, див. також Табл. 4, так:

№ Елемент Переклад
1 for
2 Prm := StartExpr Prm ПОЛIЗ(StartExpr) :=
3 step r1 1 := m1 : r2
4 StepExpr ПОЛIЗ(StepExpr)
5 to := r1 0 = m2 JF Prm Prm r2 + := m2 : r1 0 := Prm
6 TargExpr ПОЛIЗ(TargExpr)
7 do - r2 * 0 ≤ m3 JF
8 StatementList ПОЛIЗ(StatementList)
9 endfor m1 JUMP m3 :

Табл. 4: Схема трансляцiї оператора for

1. Нiчого не робити, коли зустрiлась лексема for.

2. Додати до ПОЛIЗ-коду три елементи – Prm ПОЛIЗ(StartExpr) :=.

3. Зустрiвши лексему step – згенерувати нову мiтку, хай це буде m1 ; ство-


рити, якщо вони ще не створенi, двi внутрiшнi змiннi з зарезервованими
iдентифiкаторами r1 та r2 ; додати до ПОЛIЗу iнструкцiї r1 1 := m1 :
r2 .

4. Додати до ПОЛIЗ-коду ПОЛIЗ(StepExpr).

5. Зустрiвши лексему to – згенерувати нову мiтку m2 ; додати до ПОЛIЗ-


коду iнструкцiї := r1 0 = m2 JF Prm Prm r2 + := m2 : r1 0 := Prm.

6. Додати до ПОЛIЗ-коду ПОЛIЗ(TargetExpr).

7. Зустрiвши лексему do – згенерувати нову мiтку m3 ; додати до ПОЛIЗ-


коду iнструкцiї - r2 * 0 ≤ m3 JF.

8. Додати до ПОЛIЗ-коду ПОЛIЗ(StatementList).

9 StatusDoc=Draft
1.5 Оператор циклу for До лабораторної роботи № 4 ( 2)

k := StartExpr

r1 := 1

m1 :

r2 := StepExpr StatementList

true
r1 = 0

Prm := Prm + r2
false
m2 :

r1 := 0

false true
(Prm - TargExpr)*r2 < 0
m3 :

Рис. 3: Блок-схема iнструкцiї if

10 StatusDoc=Draft
1.6 Оператори введення-виведення До лабораторної роботи № 4 ( 2)

9. Зустрiвши лексему endfor – додати до ПОЛIЗ-коду iнструкцiї m1 JUMP


m3 :

Так, наприклад коду вхiдною мовою


for i := a+1 step h/2 to (a+b)/2 do
h := v1/i
write(a+b,h,i)
endfor
вiдповiдатиме постфiксний код:
i a 1 + := r1 1 := m1 : r2 h 2 / := r1 0 = m2 JF i i r2 + := m2 :
r1 0 := i a b + 2 / - r2 * 0 ≤ m3 JF h v1 i / := a b + OUT h OUT i OUT
m1 JUMP m3 :
Або у формi Табл. 5.

№ Елемент Переклад
1 for
2 i := a+1 i a 1 + :=
3 step r1 1 := m1 : r2
4 h / 2 h 2 /
5 to := r1 0 = m2 JF i i r2 + := m2 : r1 0 := i
6 (a + b) / 2 a b + 2 /
7 do - r2 * 0 ≤ m3 JF
h := v1/i h v1 i / :=
8 write(a+b,h,i) a b + OUT h OUT i OUT
9 endfor m1 JUMP m3 :

Табл. 5: Приклад трансляцiї оператора for

1.6 Оператори введення-виведення


Пiдхi до трансляцiї операторiв введення-виведення розглянемо на прикладi
нетермiнала Out, див. також приклад у рядку 8 Табл. 5:

Out = write ’(’ OutExprList ’)’


OutExprList = OutExpr { ’,’ OutExpr }

Представимо правила для Out у формi:


Out = write ’(’ OutExpr { ’,’ OutExpr } ’)’
Схема трансляцiї Out може бути такою:

1. Нiчого не робити, коли зустрiлись лексеми write та (.

2. Зустрiвши лексему , (кома) або ) – додати до ПОЛIЗу iнструкцiю OUT,


iнакше – транслювати у ПОЛIЗ OutExpr.

11 StatusDoc=Draft
1.7 Загальна схема трансляцiї До лабораторної роботи № 4 ( 2)

1.7 Загальна схема трансляцiї


Розглянутi приклади свiдчать, що розробка схеми трансляцiї довiльної син-
таксичної конструкцiї вхiдної мови складається з таких крокiв:

1. Розглянути правила граматики.

2. Описати (специфiкацiя мови) семантику конструкцiї.

3. Для складних конструкцiй – побудувати блок-схему з використанням мi-


ток.

4. Описати блок-схему (у простих випадках – правила граматики) iнстру-


кцiями постфiкс-коду ( з використанням мiток та iнструкцiй умовного/бе-
зумовного переходу), записуючии ПОЛIЗ(Xi ) замiсть високорiвневих кон-
струкцiй Xi .

5. Iз зiставлення правил граматики та опису з попереднього пункту встано-


вити вiдповiднiсть мiж високорiвневими конструкцiями Xi та ПОЛIЗ(Xi ),
а решту фрагментiв постфiкс-коду асоцiювати з термiналами правил гра-
матики.

6. Додати до отриманої схеми опис iнших необхiдних дiй (семантичних про-


цедур), таких як, наприклад, додавання мiтки до таблицi мiток при її
створеннi.

2 Програмна реалiзацiя транслятора


2.1 Загальнi положення
Розроблений ранiше транслятор для арифметики вхiдної мови тут розши-
рюється до опрацювання оператора розгалуження.
Таблиця символiв мови доповнена логiчними константами, у лексичному
аналiзаторi tableOfLanguageTokens – лексемами/токенами ’true’:’bool’ та
’false’:’bool’. Синтаксичний аналiзатор/транслятор доповнений функцiєю
для розбору та трансляцiї логiчних виразiв за правилом:

BoolExpr = true
| false
| Expression (’=’|’<=’|’>=’|’<’|’>’|’<>’) Expression

де Expression означає арифметичний вираз.


Розширення транслятора змiстовно зводиться до розширення функцiї parseStatement(),
яка тепер крiм оператора присвоювання обробляє ще i оператор розгалуження.
Iнтерпретатор для виконання програм з оператором розгалуження тут не
розглядається.

12 StatusDoc=Draft
2.2 Код функцiй До лабораторної роботи № 4 ( 2)

2.2 Код функцiй


2.2.1 parseStatement()
Ця функцiя доповнена викликом parseIf(), рядки 13 – 15, для розбору та
трансляцiї оператора розгалуження та викликом у рядках 17 – 22 функцiй,
реалiзацiя яких у цьому прикладi не представлена.

1 def parseStatement():
2 # print(’\t\t parseStatement():’)
3 # прочитаємо поточну лексему в таблицi розбору
4 numLine, lex, tok = getSymb()
5 # якщо токен - iдентифiкатор
6 # обробити iнструкцiю присвоювання
7 if tok == ’ident’:
8 parseAssign()
9 return True
10
11 # якщо лексема - ключове слово ’if’
12 # обробити iнструкцiю розгалуження
13 elif (lex, tok) == (’if’,’keyword’):
14 parseIf()
15 return True
16
17 elif tok == ’label’:
18 parseLabel() # stub
19 return True
20 elif (lex, tok) == (’goto’,’keyword’):
21 parseGoto() # stub
22 return True
23
24 # тут - ознака того, що всi iнструкцiї були коректно
25 # розiбранi i була знайдена остання лексема програми.
26 # тому parseStatement() має завершити роботу
27 elif (lex, tok) == (’end’,’keyword’):
28 return False
29
30 else:
31 # жодна з iнструкцiй не вiдповiдає
32 # поточнiй лексемi у таблицi розбору,
33 failParse(’невiдповiднiсть iнструкцiй’,(numLine,lex,tok,’ident або if’))
34 return False

2.2.2 parseIf()
Тут реалiзована схема трансляцiї, див. роздiл 1.4. Зiставлення див. у Табл 6

1 # розбiр iнструкцiї розгалуження за правилом

13 StatusDoc=Draft
2.2 Код функцiй До лабораторної роботи № 4 ( 2)

2 # IfStatement = if BoolExpr then Statement else Statement endif


3 # функцiя названа parseIf() замiсть parseIfStatement()
4 def parseIf():
5 global numRow
6 _, lex, tok = getSymb()
7 if lex==’if’ and tok==’keyword’:
8 # ’if’ нiчого не додає до ПОЛIЗу # Трансляцiя
9 numRow += 1
10 parseBoolExpr() # Трансляцiя
11 parseToken(’then’,’keyword’,’\t’*5)
12 # Згенерувати мiтку m1 = (lex,’label’)
13 m1 = createLabel()
14 postfixCode.append(m1) # Трансляцiя
15 postfixCode.append((’JF’,’jf’))
16 # додали m1 JF
17
18 parseStatement() # Трансляцiя
19
20 parseToken(’else’,’keyword’,’\t’*5)
21 # Згенерувати мiтку m2 = (lex,’label’)
22 m2 = createLabel()
23 postfixCode.append(m2) # Трансляцiя
24 postfixCode.append((’JMP’,’jump’))
25 setValLabel(m1) # в табл. мiток
26 postfixCode.append(m1)
27 postfixCode.append((’:’,’colon’))
28 # додали m2 JMP m1 :
29 parseStatement() # Трансляцiя
30 parseToken(’endif’,’keyword’,’\t’*5)
31 setValLabel(m2) # в табл. мiток
32 postfixCode.append(m2) # Трансляцiя
33 postfixCode.append((’:’,’colon’))
34 # додали m2 JMP m1 :
35 return True
36 else: return False

2.2.3 createLabel()
Програмно згенерованi мiтки отримують iдентифiкатори ’m’+наступнийВiльнийНомер,
рядки 3–4. Якщо мiтки з таким iдентифiкатором немає у таблицi мiток – дода-
ємо її до таблицi мiток з невизначеним значенням, рядки 5–7, iнакше виконання
програми переривається з виведенням повiдомлення ’Конфлiкт мiток’, рядки
9–12. Зауважимо, що можна було би шукати справдi наступнийВiльнийНомер у
циклi, не обмежуючись номером len(tableOfLabel)+1, – тодi конфлiкт iмен
мiток не виникав би.

14 StatusDoc=Draft
2.2 Код функцiй До лабораторної роботи № 4 ( 2)

№ Дiя схеми трансляцiї Рядки


1 Нiчого не робити, коли зустрiлась лексема if 9
2 Виконати трансляцiю логiчного виразу BoolExpr у постфiксну 11
форму
3 Зустрiвши лексему then – згенерувати нову мiтку, хай це буде 12–16
m1 ; додати до ПОЛIЗу m1 JF
4 Виконати трансляцiю у постфiксну форму списку операторiв 19
SL1
5 Зустрiвши лексему else – згенерувати нову мiтку, хай це бу- 21–29
де m2 ; додати до ПОЛIЗу m2 JMP m1 :.Виконати семантичнi
процедури оператора colon, див. роздiл 1.1
6 Виконати трансляцiю у постфiксну форму списку операторiв 30
SL2
7 Зустрiвши лексему endif – додати до ПОЛIЗу m2 :. Виконати 31–34
семантичнi процедури оператора colon, див. роздiл 1.1

Табл. 6: Вiдповiднiсть коду схемi трансляцiї оператора if

1 def createLabel():
2 global tableOfLabel
3 nmb = len(tableOfLabel)+1
4 lexeme = "m"+str(nmb)
5 val = tableOfLabel.get(lexeme)
6 if val is None:
7 tableOfLabel[lexeme] = ’val_undef’
8 tok = ’label’ # # #
9 else:
10 tok = ’Конфлiкт мiток’
11 print(tok)
12 exit(1003)
13 return (lexeme,tok)

2.2.4 setValLabe()
Тут встановлюється значення мiтки, у вiдповiдностi до семантичних проце-
дур оператора colon, див. роздiл 1.1. У рядку 4 номер запису у постфiкс-кодi,
куди буде записана мiтка, встановлюється як значення цiєї мiтки .

1 def setValLabel(lbl):
2 global tableOfLabel
3 lex,_tok = lbl
4 tableOfLabel[lex] = len(postfixCode)
5 return True

15 StatusDoc=Draft
2.3 Трансляцiя програм з розгалуженням До лабораторної роботи № 4 ( 2)

2.2.5 parseBoolExpr()
Синтаксичний аналiзатор/транслятор доповнений функцiєю для розбору та
трансляцiї логiчних виразiв за правилом:

BoolExpr = true
| false
| Expression (’=’|’<=’|’>=’|’<’|’>’|’<>’) Expression

де Expression означає арифметичний вираз.

1 def parseBoolExpr():
2 global numRow
3 numLine, lex, tok = getSymb()
4 if lex == ’true’ or lex == ’false’:
5 numRow += 1
6 postfixCode.append((lex,tok)) # Трансляцiя
7 return True
8 else:
9 parseExpression() # Трансляцiя
10 numLine, lex, tok = getSymb()
11 numRow += 1
12 parseExpression() # Трансляцiя
13 if tok in (’rel_op’):
14 postfixCode.append((lex,tok)) # Трансляцiя
15 # print(’\t’*5+’в рядку {0} - {1}’.format(numLine,(lex, tok)))
16 else:
17 failParse(’mismatch in BoolExpr’,(numLine,lex,tok,’relop’))
18 return True

2.3 Трансляцiя програм з розгалуженням


Переглянемо процес трансляцiї програми
1 program
2 i f a + b < c then s := 10 e l s e d := 100 e n d i f
3 end

Запуск транслятора та результати його роботи виглядають у консолi приблизно


так:

16 StatusDoc=Draft
2.3 Трансляцiя програм з розгалуженням До лабораторної роботи № 4 ( 2)

>python postfixIF_translator.py
Translator: Переклад у ПОЛIЗ та синтаксичний аналiз завершились успiшно

Таблиця мiток
Label Value
m1 12
m2 17

Таблиця iдентифiкаторiв
Ident Type Value Index
a type_undef val_undef 1
b type_undef val_undef 2
c type_undef val_undef 3
s type_undef val_undef 4
d type_undef val_undef 5

Початковий код програми:


program
if a + b < c then s := 10 else d := 100 endif
end

Код програми у постфiкснiй формi (ПОЛIЗ):


[(’a’, ’ident’), (’b’, ’ident’), (’+’, ’add_op’), (’c’, ’ident’),
(’<’, ’rel_op’), (’m1’, ’label’), (’JF’, ’jf’), (’s’, ’ident’),
(’10’, ’int’), (’:=’, ’assign_op’), (’m2’, ’label’), (’JMP’, ’jump’),
(’m1’, ’label’), (’:’, ’colon’), (’d’, ’ident’), (’100’, ’int’),
(’:=’, ’assign_op’), (’m2’, ’label’), (’:’, ’colon’)]

Трансляцiя виконана правильно. Справдi, всi змiннi створенi, але їх значен-


ня та типи не визначенi iз-за вiдсутностi вiдповiдних команд у вхiднiй програмi.
Перехiд за мiткою m1 здiйснюється на iнструкцiю постфiксного коду з но-
мером 12, тобто, врештi, до присвоювання значення 100 змiннiй d. Якщо ж
iнструкцiя JF не спрацьовує (тобто, якщо на момент її виконання на верши-
нi стека –лексема true), то виконується наступний за JF код – присвоєння
значення 10 змiннiй з iдентифiкатором s та безумовний перехiд на мiтку m2 .
Виконаємо трансляцiю програми з вкладеними операторами
1 program
2 if a + b < c
3 then
4 if a = b
5 then s := 5
6 e l s e d := 500
7 endif
8 e l s e d := 100
9 endif

17 StatusDoc=Draft
До лабораторної роботи № 4 ( 2)

10 end

Результати виглядають у консолi приблизно так:


>python postfixIF_translator.py
Translator: Переклад у ПОЛIЗ та синтаксичний аналiз завершились успiшно

Таблиця мiток
Label Value
m1 26
m2 17
m3 22
m4 31

Таблиця iдентифiкаторiв
Ident Type Value Index
a type_undef val_undef 1
b type_undef val_undef 2
c type_undef val_undef 3
s type_undef val_undef 4
d type_undef val_undef 5

Код програми у постфiкснiй формi (ПОЛIЗ):


[(’a’, ’ident’), (’b’, ’ident’), (’+’, ’add_op’), (’c’, ’ident’),
(’<’, ’rel_op’), (’m1’, ’label’), (’JF’, ’jf’), (’a’, ’ident’),
(’b’, ’ident’), (’=’, ’rel_op’), (’m2’, ’label’), (’JF’, ’jf’),
(’s’, ’ident’), (’5’, ’int’), (’:=’, ’assign_op’), (’m3’, ’label’),

(’JMP’, ’jump’), (’m2’, ’label’), (’:’, ’colon’), (’d’, ’ident’),


(’500’, ’int’), (’:=’, ’assign_op’), (’m3’, ’label’), (’:’, ’colon’),
(’m4’, ’label’), (’JMP’, ’jump’), (’m1’, ’label’), (’:’, ’colon’),
(’d’, ’ident’), (’100’, ’int’), (’:=’, ’assign_op’), (’m4’, ’label’),
(’:’, ’colon’)]

3 Про звiт
3.1 Форма та структура звiту
Вимоги до форми – мiнiмальнi:

1. Прiзвище та iм’я студента, номер групи, номер лабораторної роботи –


у верньому колонтитулi. Нуменацiя сторiнок – у нижньому колонтитулi.
Титульний аркуш не потрiбен.

2. На першому аркушi, угорi, – назва (тема) лабораторної роботи.

18 StatusDoc=Draft
Лiтература До лабораторної роботи № 4 ( 2)

3. Далi, на першому ж аркушi та наступних – змiстовна частина

Лiтература
[1] Alfred Aho, Monica Lam, Ravi Sethi, Jeffrey Ullman Compilers: Principles,
Techniques, and Tools. Addison Wesley; 2nd edition, 2006. – 1040 p.

[2] Медведєва В.М. Транслятори: внутрiшнє подання програм та iнтерпретацiя


[Текст]: навч.посiб. [Текст]: навч.посiб. / В.М. Медведєва, В.А. Третяк/-К.:
НТУУ «КПI»,2015.-148с.

[3] Матерiали до виконання лабораторної роботи № 4 ”Трансляцiя у ПОЛIЗ


арифметичних виразiв та iнтерпретацiя постфiксного коду”

19 StatusDoc=Draft

You might also like