Professional Documents
Culture Documents
До роботи № 2. 2022
До роботи № 2. 2022
лабораторної роботи № 2
Лексичний аналiз методом дiаграми станiв
Юрiй Стативка
Березень, 2022 р.
Змiст
Вступ 1
Лексичний аналiзатор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Дiаграма станiв . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
План розробки лексичного аналiзатора . . . . . . . . . . . . . . . . . . . 2
Необхiднi програми та данi . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1
Змiст До лабораторної роботи № 2
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 StatusDoc=Draft
Змiст До лабораторної роботи № 2
Програма
вх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к для наступного повторного зчитування та обробки.
2 StatusDoc=Draft
Змiст До лабораторної роботи № 2
2. Граматика мови.
3 StatusDoc=Draft
До лабораторної роботи № 2
Statement = Assign
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’
Tab = ’\t’
Newline = ’\n’
5 StatusDoc=Draft
2.2 Семантичнi процедури До лабораторної роботи № 2
6 StatusDoc=Draft
2.2 Семантичнi процедури До лабораторної роботи № 2
7 StatusDoc=Draft
До лабораторної роботи № 2
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
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}# обробка помилок
де:
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
{ Id : idxId) }
де:
Id – iдентифiкатор (лексема);
idxId – iндекс iдентифiкатора у таблицi iдентифiкаторiв.
{ Const : idxConst}
де:
Const –константа (лексема);
idxConst – iндекс константи у таблицi констант.
{ Label : idxLbl }
де:
Label –мiтка (лексема);
idxLbl – iндекс мiтки у таблицi мiток.
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
def nextChar():
global numChar
numChar+=1
return sourceCode[numChar]
def putCharBack(numChar):
return numChar-1
def nextState(state,classCh):
try:
return stf[(state,classCh)]
except KeyError:
return stf[(state,’other’)]
12 StatusDoc=Draft
До лабораторної роботи № 2
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т.
13 StatusDoc=Draft
4.2 Форма та структура звiту До лабораторної роботи № 2
2. Граматика мови.
3. Таблиця лексем.
Тест № 4.2. Програма, всi лексеми якої допустимi у мовi Microlang1, про-
те їх використання суперечить синтаксису мови. У цьому випадку лексичний
аналiзатор помилок НЕ ЗНАХОДИТЬ.
Синтаксично помилковi фрагменти такi:
14 StatusDoc=Draft
4.2 Форма та структура звiту До лабораторної роботи № 2
1 program1 program
2
3 v1 :=:=5.4
4
5 s :=1234
6
7 end
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}
Лiтература
[1] Медведєва В.М. Транслятори: лексичний та синтаксичний аналiзатори
[Текст]: навч.посiб. / В.М. Медведєва, В.А. Третяк. – К.: НТУУ
16 StatusDoc=Draft