You are on page 1of 17

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

лабораторної роботи № 2
Лексичний аналiз методом дiаграми станiв
Юрiй Стативка
Березень, 2022 р.

Змiст
Вступ 1
Лексичний аналiзатор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Дiаграма станiв . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
План розробки лексичного аналiзатора . . . . . . . . . . . . . . . . . . . 2
Необхiднi програми та данi . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1 Початковi данi для розробки лексичного аналiзатора 4


1.1 Короткий опис мови . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Граматика мови . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Таблиця символiв мови . . . . . . . . . . . . . . . . . . . . . . . . . 5

2 Розробка лексичного аналiзатора 5


2.1 Побудова дiаграми станiв . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.1 Класи символiв . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.2 Дiаграма станiв (графiчне представлення) . . . . . . . . . . 6
2.1.3 Дiаграма станiв (символьне представлення) . . . . . . . . . 6
2.2 Семантичнi процедури . . . . . . . . . . . . . . . . . . . . . . . . . 6

3 Програмна реалiзацiя лексичного аналiзатора 8


3.1 Дiаграма станiв i таблиця лексем у кодi . . . . . . . . . . . . . . . 8
3.1.1 Визначення класу вхiдного символа . . . . . . . . . . . . . . 8
3.1.2 Дiаграма станiв у кодi . . . . . . . . . . . . . . . . . . . . . . 9
3.1.3 Таблиця символiв мови у кодi . . . . . . . . . . . . . . . . . 10
3.2 Вихiд лексичного аналiзатора . . . . . . . . . . . . . . . . . . . . . 10
3.2.1 Резюме про успiшнiсть лексичного розбору . . . . . . . . . 10
3.2.2 Таблиця символiв програми (таблиця розбору) . . . . . . . 10
3.2.3 Таблиця iдентифiкаторiв . . . . . . . . . . . . . . . . . . . . 11
3.2.4 Таблиця констант . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2.5 Таблиця мiток . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3 Програмна реалiзацiя основних функцiй . . . . . . . . . . . . . . . 11

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

3.3.1 Функцiя верхнього рiвня . . . . . . . . . . . . . . . . . . . . 11


3.3.2 Функцiї читання символу та його повернення у вхiдний по-
тiк (зiрочка) . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3.3 Переходи у дiаграмi станiв . . . . . . . . . . . . . . . . . . . 12
3.3.4 Реалiзацiя семантичних процедур . . . . . . . . . . . . . . . 13

4 Про звiт 13
4.1 Файли та тексти . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.2 Форма та структура звiту . . . . . . . . . . . . . . . . . . . . . . . . 13

Лiтература 16

Вступ
Цей текст мiстить послiдовну розповiдь про побудову лексичного аналiза-
тора мови програмування з використанням дiаграми станiв. Код розглянутого
прикладу лексичного аналiзатора додається у архiвi.
Тi, хто вже зрозумiли як виконати це завдання чи вже виконали його, мо-
жуть тiльки переглянути вимоги до оформлення звiту у роздiлi 4 .
Мета лабораторної роботи – програмна реалiзацiя лексичного аналiза-
тора заданої мови з використанням дiаграми станiв.

Лексичний аналiзатор
Лексичний аналiзатор (сканер, лексер) – аналiзує програму, написану вхi-
дною мовою, щодо допустимостi наявних у програмi лексем. Кажуть, що ле-
ксичний аналiзатор перетворює потiк символiв (characters) вхiдного потоку на
потiк токенiв вихiдного потоку, див. напр. [1, 2].
Вхiдний потiк будемо асоцiювати з файлом, що мiстить програму вхiдною
мовою, а вихiдний – з таблицею розбору програми (вiдому також як таблиця
символiв (table of symbol) програми), у якiй послiдовно зберiгатимуться токени
розпiзнаних лексем. Деяку додаткову iнформацiю зберiгатимемо у таблицях
iдентифiкаторiв, констант та мiток.
Отже, Вхiд лексичного аналiзатора – програма вхiдною мовою.
Вихiд, тобто результат роботи, лексичного аналiзатора:

1. Повiдомлення про успiшнiсть чи неуспiшнiсть лексичного аналiзу.


У випадку неуспiшностi:

• локалiзацiя помилки (номер рядка) у вхiднiй програмi;


• дiагностичне повiдомлення.

2. Таблиця розбору (таблиця символiв програми) – мiстить данi про кожну


лексему програми: номер рядка, лексема, токен, iндекс iдентифiкатора або
константи.

3. Таблицi iдентифiкаторiв, констант, мiток (якщо потрiбнi).

1 StatusDoc=Draft
Змiст До лабораторної роботи № 2

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


томата (дiаграми станiв),

Програма
вхiдною мовою
w


Лексичний аналiзатор
Iмiтацiя Cемантичнi
скiнченного процедури
автомата
w
w

Повiдомлення про успiх/неуспiх
Таблицi: Локалiзацiя
символiв, iден- помилки та
тифiкаторiв, дiагностичне
констант, мiток повiдомлення

Дiаграма станiв
Скiнченний автомат з деякою додатковою, корисною для програмування,
iнформацiєю називають дiаграмою станiв. Так на Рис. 1 функцiя переходiв ви-
значена не на окремих символах, а на класах символiв (Digit, Letter, other),
а мiтка * нагадує про необхiднiсть повернути вже прочитаний символ класу
other у вхiдний потiк для наступного повторного зчитування та обробки.

Рис. 1. Дiаграма станiв для розпiзнавання iдентифiкатора

План розробки лексичного аналiзатора


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

1. Побудувати дiаграму станiв для розпiзнавання лексем мови

2 StatusDoc=Draft
Змiст До лабораторної роботи № 2

1) Визначити класи символiв


2) Побудувати графiчно в JFLAP
3) Записати у символьнiй формi, визначивши всi елементи
кортежу (Q, Σ, δ, q0 , F )

2. Визначити семантичнi процедури для кожного заключного стану дiаграми


станiв

3. Надати лексичному аналiзаторовi iнформацiю


(про лексеми мови = дiаграму станiв + таблицю лексем мови)

1) Визначити функцiю (метод) для вiднесення символiв до одного з кла-


сiв
2) Обрати структури даних для зберiгання iнформацiї про дiаграму ста-
нiв, тобто про Q, Σ, δ, q0 та F
3) Обрати структуру даних для зберiгання iнформацiї про таблицю сим-
волiв мови

4. Вихiд лексичного аналiзатора (результат роботи).

1) Повiдомлення про успiшнiсть/неуспiшнiсть лексичного аналiзу вхi-


дної програми, дiагностичне повiдомлення
2) Таблиця розбору (таблиця символiв програми)
3) Таблицi iдентифiкаторiв, констант, мiток (якщо потрiбнi)

5. Програмна реалiзацiя сканера (лексичного аналiзатора)

1) Функцiї/методи для читання вхiдного потоку та повернення у вхiдний


потiк (зiрочка)
2) Функцiї/методи для переходу у наступний стан
3) Функцiї/методи для реалiзацiї семантичних процедур

6. Скласти план тестування та протестувати на:

1) БАЗОВОМУ прикладi програми


2) на прикладi з вкладеними конструкцiями
3) на прикладах, що демонструють виявлення помилок та дiагностичнi
повiдомлення

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


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

1. Короткий опис мови (завдання).

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

3 StatusDoc=Draft
До лабораторної роботи № 2

3. Таблиця символiв мови (таблиця лексем).

4. Програма JFLAP для побудови дiаграми станiв.

5. Базовий та iншi приклади програм вхiдною мовою для тестування.

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

1 Початковi данi для розробки лексичного ана-


лiзатора
1.1 Короткий опис мови
Мова програмування MicroLang1.
Програма складається iз списку iнструкцiй присвоювання мiж ключовими
словами ’begin’ та ’end’. Мова пiдтримує роботу з дiйсними та цiлими вираза-
ми. Дiйснi константи представленi у форматi з плаваючою крапкою. Вирази
можуть мiстити чотири основнi (лiвоасоцiативнi) арифметичнi операцiї та кру-
глi дужки.

1.2 Граматика мови


Program = program StatementList end

StatementList = Statement { Statement }

Statement = Assign

Assign = Ident ’:=’ Expression

Ident = Letter {Letter | Digit }

Expression = Expression (’+’ | ’-’ | ’*’ | ’/’) Expression


| Id
| Const
| ’(’ Expression ’)’

Const = Float | Int

Float = Digit {Digit} ’.’ {Digit}

Int = Digit {Digit}

Letter = a | b | c | d | e | f | g | h | i | j | k | l | m | n | o
| p | q | r | s | t | u | v | w | x | y | z

4 StatusDoc=Draft
1.3 Таблиця символiв мови До лабораторної роботи № 2

Digit = ’0’ | ’1’ | ’2’ | ’3’ | ’4’ | ’5’ | ’6’ | ’7’ | ’8’ | ’9’

WhiteSpace = (Blank|Tab) {Blank|Tab}

Blank = "’ ’"

Tab = ’\t’

Newline = ’\n’

Всi нетермiнали починаються з великої лiтери. Термiнали – з маленької або


у лапках.

1.3 Таблиця символiв мови

Код Приклади лексем Токен Неформальний опис


1 a, x1, z12f id iдентифiкатор
2 123, 0, 521 int цiле без знака
3 1.012, 34.76, 876.23 float дiйсне без знака
4 program keyword символ program
5 end keyword символ end
6 := assign_op символ :=
7 + add_op символ +
8 - add_op символ -
9 * mult_op символ *
10 / mult_op символ /
11 ( par_op символ (
12 ) par_op символ )
13 . dot символ .
14 \t ws горизонтальна табуляцiя
15 \32 ws пробiл
16 \n eol кiнець рядка

Табл. 1. Таблиця лексем мови MicroLang1

2 Розробка лексичного аналiзатора


2.1 Побудова дiаграми станiв
2.1.1 Класи символiв
Оберемо класи символiв: Letter та Digit для символiв, позначених одно-
йменними нетермiналами в граматицi, клас dot - для символу . (крапка), клас
ws - для пробiльних символiв, клас nl - для символу нового рядка, клас other
- для символiв, що не належать до поточної лексеми.

5 StatusDoc=Draft
2.2 Семантичнi процедури До лабораторної роботи № 2

2.1.2 Дiаграма станiв (графiчне представлення)


Лексеми мови, представленi у Табл. 1 i такi, що мiстять бiльше одного
символа, можуть бути розпiзнанi детермiнованими автоматами, див. Рис. 2 –
5.
На Рис. 6 представлена узагальнена для мови MicroLang1 дiаграма станiв,
отримана шляхом об’єднання стартових станiв часткових дiаграм та доповнен-
ня кожного не заключного стану переходом за символом класу other у певний
заключний стан з мiткою ERROR. На дiаграмi представленi також переходи для
односимвольних лексем – пробiльних символiв, символу нового рядка, арифме-
тичних операторiв та дужок.

2.1.3 Дiаграма станiв (символьне представлення)


Дiаграма станiв як детермiнований скiнченний автомат:
M = (Q, Σ, δ, q0 , F )
Множина станiв:
Q = {0, 1, 2, 4, 5, 6, 9, 11, 12, 13, 14, 101, 102}
Алфавiт:
Σ = {a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ., :
, =, ∗, +, −, /, (, ), \n, \t}
Функцiя переходiв:
δ(0, Letter) = 1; δ(1, Letter) = 1; δ(1, Digit) = 1; δ(1, other) = 2;
δ(0, Digit) = 4; δ(4, Digit) = 4; δ(4, dot) = 5; δ(5, Digit) = 5; δ(5, other) = 6;
δ(4, other) = 9;
δ(0, ‘ :0 ) = 11; δ(11,0 =0 ) = 12;
δ(11, other) = 102;
δ(0, ws) = 0;
δ(0, nl) = 13;
δ(0, ‘+0 ) = 14; δ(0, ‘−0 ) = 14; δ(0, ‘∗0 ) = 14; δ(0,0 /0 ) = 14; δ(0, ‘(‘) = 14; δ(0, ‘)0 ) = 14;
δ(0, other) = 101
Стартовий стан: q0 = 0
Множина заключних станiв: F = {2, 6, 9, 12, 13, 14, 101, 102}
Заключнi стани, що потребують додаткової обробки:
Fstar = {2, 6, 9}
FERROR = {101, 102}

2.2 Семантичнi процедури


Перехiд до заключного стану дiаграми передбачає виконання певних дiй, якi
знаходяться за межами формалiзму скiнченних автоматiв i якi називають се-
мантичними процедурами. Перелiк семантичних процедур для мови MicroLang1
наведено у Табл. 2.

6 StatusDoc=Draft
2.2 Семантичнi процедури До лабораторної роботи № 2

Рис. 2. Дiаграма станiв для розпiзнавання iдентифiкатора

Рис. 3. Дiаграма станiв дiйсної константи

Рис. 4. Дiаграма станiв для цiлої константи

Рис. 5. Дiаграма станiв для розпiзнавання оператора присвоювання

7 StatusDoc=Draft
До лабораторної роботи № 2

Рис. 6. Дiаграма станiв для розпiзнавання довiльних лексем мови MicroLang1

3 Програмна реалiзацiя лексичного аналiзатора


3.1 Дiаграма станiв i таблиця лексем у кодi
Лексичний аналiзатор реалiзується мовою python. Усi необхiднi таблицi ре-
алiзуються як словники (dictionary) мови python.

3.1.1 Визначення класу вхiдного символа


Функцiя classOfChar() повертає клас, до якого належить символ char:

1 def classOfChar(char):
2 if char in ’.’ :
3 res="dot"
4 elif char in ’abcdefghijklmnopqrstuvwxyz’ :
5 res="Letter"
6 elif char in "0123456789" :
7 res="Digit"
8 elif char in " \t" :
9 res="ws"

8 StatusDoc=Draft
3.1 Дiаграма станiв i таблиця лексем у кодi До лабораторної роботи № 2

Стан Токен Семантичнi процедури


Визначити: id чи keyword?
Якщо id – обробити таблицю iдентифiкаторiв
2 id або keyword Занести лексему в таблицю розбору
Повернути необроблений символ у вхiдний потiк
Перейти у стартовий стан
Обробити таблицю констант
6 float Занести лексему в таблицю розбору
Повернути необроблений символ у вхiдний потiк
Перейти у стартовий стан
Обробити таблицю констант
9 int Занести лексему в таблицю розбору
Повернути необроблений символ у вхiдний потiк
Перейти у стартовий стан
12 assign_op Занести лексему в таблицю розбору
Перейти у стартовий стан
13 nl Збiльшити лiчильник рядкiв на 1
Перейти у стартовий стан
14 add_op, mult_op, par_op Занести лексему в таблицю розбору
Перейти у стартовий стан

Табл. 2. Семантичнi процедури

10 elif char in "\n" :


11 res="nl"
12 elif char in "+-:=*/()" :
13 res=char
14 else: res=’символ не належить алфавiту’
15 return res

3.1.2 Дiаграма станiв у кодi


Функцiя переходiв δ представлена у формi словника (dictionary) stf (state-
transition function) мови python:

1 # state-transition function
2 stf={(0,’Letter’):1, (1,’Letter’):1, (1,’Digit’):1, (1,’other’):2,\
3 (0,’Digit’):4, (4,’Digit’):4, (4,’dot’):5, (5,’Digit’):5, (5,’other’):6, \
4 (4,’other’):9, \
5 (0, ’:’):11, (11,’=’):12,\
6 (11,’other’):102,\
7 (0, ’ws’):0, \
8 (0, ’nl’):13, \
9 (0, ’+’):14, (0, ’-’):14, (0, ’*’):14, \
10 (0, ’/’):14, (0, ’(’):14, (0, ’)’):14, \
11 (0, ’other’):101
12 }

9 StatusDoc=Draft
3.2 Вихiд лексичного аналiзатора До лабораторної роботи № 2

13
14
15 initState = 0 # q0 - стартовий стан
16 F={2,6,9,12,13,14,101,102} # множина заключних станiв
17 Fstar={2,6,9} # зiрочка
18 Ferror={101,102}# обробка помилок

3.1.3 Таблиця символiв мови у кодi


Таблиця символiв мови реалiзована у формi двох словникiв – tableOfLanguageTokens
та tableIdentFloatInt. Перший мiстить iнформацiю про токени, що однозна-
чно представленi перелiком лексем, другий – про iдентифiкатори та константи.

1 # Таблиця лексем мови


2 tableOfLanguageTokens = {’program’:’keyword’, ’end’:’keyword’,
3 ’:=’:’assign_op’, ’.’:’dot’, ’ ’:’ws’, ’\t’:’ws’, ’\n’:’nl’,
4 ’-’:’add_op’, ’+’:’add_op’, ’*’:’mult_op’,
5 ’/’:’mult_op’, ’(’:’par_op’, ’)’:’par_op’}
6 # Решту токенiв визначаємо не за лексемою, а за заключним станом
7 tableIdentFloatInt = {2:’ident’, 6:’float’, 9:’int’}

3.2 Вихiд лексичного аналiзатора


3.2.1 Резюме про успiшнiсть лексичного розбору
Повiдомлення формуються наступними командами:
1. про успiшнiсть (функцiя lex())
– print(’Lexer: Лексичний аналiз завершено успiшно’)
2. про неуспiшнiсть (функцiя lex())
– print(’Lexer: Аварiйне завершення програми з кодом 0’.format(e))
3. дiагностичнi повiдомлення у станах 101 та 102 вiдповiдно (функцiя fail())
– print(’Lexer: у рядку ’,numLine,’ неочiкуваний символ ’+char)
– print(’Lexer: у рядку ’,numLine,’ очiкувався символ =, а не ’+char)

3.2.2 Таблиця символiв програми (таблиця розбору)


Таблиця розбору реалiзована як словник tableOfSymb у форматi:

{ n_rec : (num_line, lexeme, token, idxIdConst) }

де:
n_rec – номер запису в таблицi символiв програми;
num_line – номер рядка вхiдної програми;
lexeme – лексема;
token – токен лексеми;
idxIdConst – iндекс iдентифiкатора або константи у таблицi iдентифiкаторiв
та констант вiдповiдно; для iнших лексем – порожнiй рядок.

10 StatusDoc=Draft
3.3 Програмна реалiзацiя основних функцiй До лабораторної роботи № 2

3.2.3 Таблиця iдентифiкаторiв


Таблиця iдентифiкаторiв tableOfId:

{ Id : idxId) }

де:
Id – iдентифiкатор (лексема);
idxId – iндекс iдентифiкатора у таблицi iдентифiкаторiв.

3.2.4 Таблиця констант


Таблиця констант tableOfConst:

{ Const : idxConst}

де:
Const –константа (лексема);
idxConst – iндекс константи у таблицi констант.

3.2.5 Таблиця мiток


Таблиця мiток tableOfLabel:

{ Label : idxLbl }

де:
Label –мiтка (лексема);
idxLbl – iндекс мiтки у таблицi мiток.

3.3 Програмна реалiзацiя основних функцiй


3.3.1 Функцiя верхнього рiвня
Функцiя lex(), у циклi, див. рядки 11-21 коду, намагається проаналiзува-
ти всi символи програми вхiдною мовою (while numChar<lenCode, рядок 11).
Зчитування символу, вiднесення його до одного з прийнятих класiв та перехiд
у наступний стан здiйснюється у рядках 12 - 14 коду. Коли перехiд здiйснює-
ться у заключний, стартовий чи iнший стан (див. рядки 15, 17 та 19), здiйсню-
ється, вiдповiдно, виконання семантичних процедур (функцiя processing()),
пiдготовка до пошуку нової лексеми (рядок 18), або приєднання прочитаного
символу до поточної лексеми (рядок 20).
Якщо при розборi буде досягнуто заключного стану iз множини FERROR , то
фукнцiєю fail() буде згенеровано виняток, який буде перехоплено та оброблено
у блоцi except, рядки 15 - 18.

1 def lex():
2 global state,numLine,char,lexeme,numChar,FSuccess
3 try:
4 while numChar<lenCode:

11 StatusDoc=Draft
3.3 Програмна реалiзацiя основних функцiй До лабораторної роботи № 2

5 char=nextChar() # прочитати наступний символ


6 classCh=classOfChar(char) # до якого класу належить
7 state=nextState(state,classCh) # обчислити наступний стан
8 if (is_final(state)): # якщо стан заключний
9 processing() # виконати семантичнi процедури
10 elif state==initState: # якщо стан НЕ закл., а стартовий, то
11 lexeme=’’ # збиратимемо нову лексему
12 else: # якщо стан НЕ закл. i не стартовий, то
13 lexeme+=char # додати символ до лексеми
14 print(’Lexer: Лексичний аналiз завершено успiшно’)
15 except SystemExit as e:
16 FSuccess = (False,’Lexer’) # Встановити ознаку неуспiшностi
17 # Повiдомити про неуспiх
18 print(’Lexer: Аварiйне завершення програми з кодом {0}’.format(e))

3.3.2 Функцiї читання символу та його повернення у вхiдний потiк


(зiрочка)
Вхiдна програма зберiгається у рядку (String) sourceCode. Тому читання на-
ступного символа реалiзується функцiєю nextChar() шляхом зчитування сим-
вола з попередньо iнкрементованим його номером numChar.

def nextChar():
global numChar
numChar+=1
return sourceCode[numChar]

Повернення усимволу у вхiдний потiк реалiзується функцiєю putCharBack(numChar)


шляхом декрементацiї номера символу numChar.

def putCharBack(numChar):
return numChar-1

3.3.3 Переходи у дiаграмi станiв


Функцiя nextState(state,classCh) намагається знайти значення у словни-
ку stf значення за ключем (state,classCh). Якщо таке значення знайдено,
то воно i є iм’ям наступного стану, якщо ж запису з таким ключем немає – то
перхоплюється згенерований системою python виняток KeyError, а перехiд зi
стану state здiйснюється по класу символiв other.

def nextState(state,classCh):
try:
return stf[(state,classCh)]
except KeyError:
return stf[(state,’other’)]

12 StatusDoc=Draft
До лабораторної роботи № 2

3.3.4 Реалiзацiя семантичних процедур


1 def processing():
2 global state,lexeme,char,numLine,numChar, tableOfSymb
3 if state==13: # \n
4 numLine+=1
5 state=initState
6 if state in (2,6,9): # keyword, ident, float, int
7 token=getToken(state,lexeme)
8 if token != ’keyword’: # НЕ keyword
9 index=indexIdConst(state,lexeme)
10 print(’{0:<3d} {1:<10s} {2:<10s} {3:<2d} ’.format(numLine,\
11 lexeme,token,index))
12 tableOfSymb[len(tableOfSymb)+1] = (numLine,lexeme,token,index)
13 else: # якщо keyword
14 print(’{0:<3d} {1:<10s} {2:<10s} ’.format(numLine,lexeme,token))
15 tableOfSymb[len(tableOfSymb)+1] = (numLine,lexeme,token,’’)
16 lexeme=’’
17 numChar=putCharBack(numChar) # зiрочка
18 state=initState
19 if state in (12,14): #12: # assign_op # in (12,14):
20 lexeme+=char
21 token=getToken(state,lexeme)
22 print(’{0:<3d} {1:<10s} {2:<10s} ’.format(numLine,lexeme,token))
23 tableOfSymb[len(tableOfSymb)+1] = (numLine,lexeme,token,’’)
24 lexeme=’’
25 state=initState
26 if state in Ferror: #(101,102): # ERROR
27 fail()

4 Про звiт
4.1 Файли та тексти
Нагадую, що звiти про виконання лабораторних робiт треба створювати у
Google Docs.
Називати файли треба за шаблоном НомерГрупи.ЛР_Номер.ПрiзвищеIнiцiали,
наприклад так ТВ-з91.ЛР_1.АндрiєнкоБВ.
Тут дуже важливо, щоб дефiс, пiдкреслювання та крапка були саме на
своїх мiсцях, не було зайвих пробiлiв чи iнших символiв. Одноманiтнiсть назв
значно зменшує трудомiсткiсть перевiрки та iмовiрнiсть помилки при облiку
виконаних вами робiт.

4.2 Форма та структура звiту


Вимоги до форми – мiнiмальнi:

13 StatusDoc=Draft
4.2 Форма та структура звiту До лабораторної роботи № 2

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


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

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


головок цього документу.

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

Структура змiстовної частини звiту:

1. Завдання саме Вашого (автора звiту) варiанту. Повне, включно з вимогами


до арифметики (цiлi, дiйснi, п’ять операцiй, правоасоцiативнiсть пiднесе-
ння до степеня) i т. i.

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

3. Таблиця лексем.

4. Далi вiдповiдно до плану, див. стор. 2.

5. На вiдмiну вiд цього тексту, у звiтi не потрiбнi промiжнi результати (на-


приклад частковi дiаграми) та роз’яснення загальних речей. Пишiть текст
для квалiфiкованого читача, якому ви пояснюєте, як побудований ваш
лексичний аналiзатор, що вiн аналiзує саме вашу мову, i що вiн працює
коректно.

6. Базовий та iншу приклади програм вхiдною мовою для тестування лекси-


чного аналiзатора.

7. План тестування, напр. як у Табл. 3.

8. Протокол тестування у формi текстових копiй термiнала: фрагмент про-


грами + результат обробки + ваш коментар та/чи оцiнка результату

9. Висновки. Тут очiкується власнi оцiнка/констатацiя/враження/зауваже-


ння автора звiту - виконавця лабораторної роботи.

План тестування може бути представлений у формi таблицi 3:


Фрагмент протоколу тестування може виглядати, як показано далi.

Тест № 4.2. Програма, всi лексеми якої допустимi у мовi Microlang1, про-
те їх використання суперечить синтаксису мови. У цьому випадку лексичний
аналiзатор помилок НЕ ЗНАХОДИТЬ.
Синтаксично помилковi фрагменти такi:

1. програма починається з лексеми program1, а не з program;

2. у рядку 3 некоректне використання двох лексем :=

14 StatusDoc=Draft
4.2 Форма та структура звiту До лабораторної роботи № 2

№ Тип випробування Очiкуванний ре- Кiлькiсть ви-


зультат пробувань
1 базовий приклад успiшне виконання, 1
таблицi iдентифiка-
торiв, констант, мi-
ток
2 вкладенi конструкцiї успiшне виконання, 5
таблицi iдентифiка-
торiв, констант, мi-
ток
3 наявнiсть недопустимих лексем повiдомлення про ...
помилку + дiа-
гностика, таблицi
iдентифiкаторiв,
констант, мiток
4 надлишок чи вiдсутнiсть синтакси- ... ...
чно виправданих лексем, у т.ч. клю-
чових слiв
5 помилково написанi ключовi слова . . . ...
6 ... ...

Табл. 3. План тестування

1 program1 program
2
3 v1 :=:=5.4
4
5 s :=1234
6
7 end

Пiсля розбору лексичний аналiзатор повiдомляє:


>python my_lang_lex_example2.py
1 program1 ident 1
1 program keyword
3 v1 ident 2
3 := assign_op
3 := assign_op
3 5.4 float 1
5 s ident 3
5 := assign_op
5 1234 int 2
7 end keyword
Lexer: Лексичний аналiз завершено успiшно

15 StatusDoc=Draft
Лiтература До лабораторної роботи № 2

------------------------------
tableOfSymb:{1: (1, ’program1’, ’ident’, 1),
2: (1, ’program’, ’keyword’, ’’),
3: (3, ’v1’, ’ident’, 2),
4: (3, ’:=’, ’assign_op’, ’’),
5: (3, ’:=’, ’assign_op’, ’’),
6: (3, ’5.4’, ’float’, 1),
7: (5, ’s’, ’ident’, 3),
8: (5, ’:=’, ’assign_op’, ’’),
9: (5, ’1234’, ’int’, 2),
10: (7, ’end’, ’keyword’, ’’)}
tableOfId:{’program1’: 1, ’v1’: 2, ’s’: 3}
tableOfConst:{’5.4’: 1, ’1234’: 2}

Коментар до тесту № 4.2: лексичний аналiзатор правильно розпiзнав усi ле-


ксеми та визначив їх токени, зокрема program1 розпiзнано як iдентифiкатор.
Синтаксичну правильнiсть вiн не перевiряє, тому з точки зору лексики наведе-
на програма коректна i лексер повiдомив про успiшнiсть лексичного розбору.

Лiтература
[1] Медведєва В.М. Транслятори: лексичний та синтаксичний аналiзатори
[Текст]: навч.посiб. / В.М. Медведєва, В.А. Третяк. – К.: НТУУ

[2] Ахо, А. Компиляторы: принципы, технологии и инструментарий, 2-е изд. :


Пер. с англ. / Альфред Ахо, Моника Лам, Рави Сети, Джефри Д. Ульман.
– М. : ООО „И.Д. Вильямс”, 2008. – 1184 с.

16 StatusDoc=Draft

You might also like