Professional Documents
Culture Documents
До роботи № 4 (частина 2)
До роботи № 4 (частина 2)
Змiст
Вступ 2
Мотивацiйний приклад . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Необхiднi програми та данi . . . . . . . . . . . . . . . . . . . . . . . . . . 3
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)
1. Граматика мови.
3. Лексичний аналiзатор.
1
Пам’ятаємо, що [2] мiстить приклади трансляцiї великої кiлькостi рiзноманiтних синта-
ксичних конструкцiй
2
Про термiнологiю див. Зауваження на стор. 8
3 StatusDoc=Draft
1.2 Оператор безумовного переходу goto До лабораторної роботи № 4 ( 2)
Таблиця iдентифiкаторiв
Ident Type Value Index
Таблиця констант
Const Type Value Index
Таблиця мiток
Label Value
m5 0
m2 2
4 StatusDoc=Draft
1.2 Оператор безумовного переходу goto До лабораторної роботи № 4 ( 2)
Таблиця символ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
IfStatement = if BoolExpression
then StatementList1
else StatementList2
endif
6 StatusDoc=Draft
1.4 Оператор розгалуження if До лабораторної роботи № 4 ( 2)
true false
BoolExpr
m1 :
SL1 SL2
m2 :
7 StatusDoc=Draft
1.5 Оператор циклу for До лабораторної роботи № 4 ( 2)
8 StatusDoc=Draft
1.5 Оператор циклу for До лабораторної роботи № 4 ( 2)
№ Елемент Переклад
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 :
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 :
10 StatusDoc=Draft
1.6 Оператори введення-виведення До лабораторної роботи № 4 ( 2)
№ Елемент Переклад
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 :
11 StatusDoc=Draft
1.7 Загальна схема трансляцiї До лабораторної роботи № 4 ( 2)
BoolExpr = true
| false
| Expression (’=’|’<=’|’>=’|’<’|’>’|’<>’) Expression
12 StatusDoc=Draft
2.2 Код функцiй До лабораторної роботи № 4 ( 2)
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
13 StatusDoc=Draft
2.2 Код функцiй До лабораторної роботи № 4 ( 2)
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)
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
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
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
17 StatusDoc=Draft
До лабораторної роботи № 4 ( 2)
10 end
Таблиця м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
3 Про звiт
3.1 Форма та структура звiту
Вимоги до форми – мiнiмальнi:
18 StatusDoc=Draft
Лiтература До лабораторної роботи № 4 ( 2)
Лiтература
[1] Alfred Aho, Monica Lam, Ravi Sethi, Jeffrey Ullman Compilers: Principles,
Techniques, and Tools. Addison Wesley; 2nd edition, 2006. – 1040 p.
19 StatusDoc=Draft