Вы находитесь на странице: 1из 12

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

ОДЕСЬКИЙ НАЦІОНАЛЬНИЙ ПОЛІТЕХНІЧНИЙ УНІВЕРСИТЕТ


ІНСТИТУТ КОМП’ЮТЕРНИХ СИСТЕМ
КАФЕДРА СИСТЕМНОГО ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ

Лабораторна робота №2
по темі: «Проектування лексичного аналізатора»
з дисципліни: «Теорія формальних граматик і трансляції»

Виконав
Студент групи АС-191
Кльопа М.С.
Перевірила:
Комлева Н.О.

Одеса
2020
Задание
• индивидуальное задание (распечатка Генератора Заданий);
• определение состава лексем;
• разработка автоматной грамматики для каждой лексемы;
• построение обобщенного конечного автомата;
• определение семантических действий сканера;
• разработка структуры таблиц сканера;
• выполнение лексического анализа тестовой входной цепочки (из ЛР №1);
• выводы.
Индивидуальное задание:
1. Разработать формальную грамматику (ЛР №1) для выражений, которые могут содержать:
1.1. логические операции: &&, !.
1.2. Арифметические и сдвиговые операции: * / + %
1.3. Константы: десятичные, шестнадцатиричные (префикс - &H) и двоичные (префикс - &B).

1.4. Идентификаторы: double (суффикс #), char (суффикс @), string (суффикс $).
1.5. Функции: abs, strchr.
1.6. Знаки отношений.
1.7. Приоритет выполнения операций - традиционный, использовать круглые скобки для
возможности изменения приоритета.
1.8. Просмотр выражения слева-направо. Свертка выражения слева-направо.
1.9. Если в перечне типов идентификаторов отсутствуют типы, требуемые для
реализации функции, необходимо доопределить перечень типов.
3. Разработать сканер (ЛР № 2-3)
Ход работы
1. Постоянные таблицы
Таблица однолитерных терминальных символов ТТС1 (0)
Адрес в табл. Код литеры Класс литеры KL
0 ( 0 (разделитель)
1 ) 0 Разделител 0
2 < 0 ь
3 > 0 Буква 1
4 % 0 Цифра 2
5 / 0
6 * 0
7 = 0
8 + 0
9 , 0
10 @ 0
11 & 0
12 ! 0
13 $ 0
14 # 0
15 A 1 (буква)
... ... ...
41 Z 1
42 a 1
... ... ...
68 Z 1
69 0 2 (цифра)
70 1 2
78 9 2

Таблицы двухлитерных терминальных символов ТТС2 (1)


Адрес в табл. Код литеры Класс литеры KL
0 <= 0 (разделитель)
1 >= 0
2 == 0
3 && 0

Таблица ключевых слов ТКС


Адрес в табл. Ключевое слово
0 abs
1 strchr
Таблица типов лексических единиц ТE (3)

LE TLE
Идент. 0
Кл. слово 1
Конст. 2
Однолитерн. разделит. 3
Двухлитерн. разделит. 4
2. Временные таблицы

a+b/(c%d) >= 3 && 10 < abs(p + i)

Таблица идентификаторов ТИ (4)


Адр. в Имя Основ. сист. Форма Точность Тип Адрес
табл. счисл. предст. памяти
0 a dec double
1 b dec double
2 c dec double
3 d dec double
4 p dec double
5 i dec double

Таблица констант ТК (5)


Адр. в табл. Константа Основ. сист. счисл. Форма представл. Точность
0 3 dec FIXED 1
1 10 dec FIXED 2
Таблица стандартных символов ТСС (6)
ALE TLE
A 0 4
+ 8 0
B 1 4
/ 5 0
( 0 0
C 2 4
% 4 0
d 3 4
) 1 0
>= 1 1
3 0 5
&& 3 1
10 1 5
< 2 0
abs 0 2
( 0 0
р 4 4
+ 8 0
i 5 4
) 1 0

3. Определение состава лексем


Лексема => Идент|Ключ_сл|Конст|Разд1|Разд2
Идент => double | char | string
Конст => десятичная| восьмеричная| двоичная
б - буква
ц – цифра
Идентификатор:
S = "б"I;
А = "б"I| "ц"I| "#"| "@"| "$"
Константа:
S = "ц"B3| "&"С;
С = "H"В1|"B"B2;
В3 = "ц"В| "k"
В1 = "ц"В1| "A"В1| ...| "F"B1| "k"
В2 = "0"B2| "1"B2| "k"

Односимв. разд:
S = "*"| "+"| "%"| "/"| "!"| ","| ">"| "<"| "="| "("| ")"
Двухсимвольные разделители:
S = "&"R1| "<"R2| ">"R2| "="R2
R1 = "&"
R2 = "="
4. Обобщенный конечный автомат:

5. Определение семантичекских действий сканера


А – исходный модуль, содержащий все лексемы.
NA – количество символов в строке.
TL – текущая литера, которая подлежит обработке в данный момент.
NTL – номер текущей литеры в строке А.
KTL – класс текущей литеры.
Буква 0
Цифра 1
Разделит. 2
Недопуст.символ 3
TLE – тип лексической единицы.
LE – строка переменного размера, в которой будет накапливаться выделяемая лексическая единица.
NLE – число литер в строке LE.
MDLE – максимально допустимая длина лексические единицы. Допустим, что идентификатор имеет
максимальную длину 8, целое число без знака – 7, однолитерный разделитель – 1.
ALE – адрес лексической единицы в соответствующей таблице.
TTC1 – таблица однолитерных терминальных символов.
TK – таблица констант.
TИ – таблица идентификаторов.
TCC – таблица стандартных символов.
REZ – результат поиска лексической единицы в соответствующей таблице.
ZAPTAB (TLE, LE, ALE, REZ) – поиск лексемы в таблице и запись её.
OUT (LE, ALE) – запись лексемы в таблицу стандартных символов ТСС.
PODGOT – подготавливает строку для лексической единицы LE = ” ”, определяет NLE = 0, выделяет
первую литеру строки А, определяет класс текущей (выделенной) литеры KTL= KLАSS (TL).

TIP – определяет тип лексической единицы. Для включения текущей литеры ТL в состав
лексической единицы выполняет NLE = NLE+1 и проверяет условие NLE =< MDLE.
BKL – включает текущую литеру в состав LE или свидетельствует о семантической ошибке и
вызвает подпрограмму MIS (ошибка), которая фиксирует ошибку и печатает комментарий.
CLL – определяет следующие литеры распознаваемой лексемы, выполняет NTL = NTL+1, выделяет
текущую литеру TL = A[NTL], определяет её класс KTL = KLASS (TL).
Пока в качестве текущей литеры появляется цифра повторно вызываются подпрограммы BKL, CLL.
Появление буквы вслед за цифрой свидетельствует об ошибке. Появление разделителя
свидетельствует об окончании константы.
Подпрограмма ZAPTAB (TLE, LE, ALE, REZ) осуществляет поиск константы (идентификатора и
т.д.) в таблице констант (идентификаторов). Если полученная константа (идентификатор) уже есть в
таблице констант ТК (или ТИ), то повторно она не записывается в эту таблицу, а осуществляется
формирование очередного элемента в таблице стандартных символах ТСС. Это формирование
осуществляется подпрограммой OUT (TLE, ALE).
Для распознавания ключевых слов и идентификаторов используется одна и та же грамматика. Если
сформированная LE является идентификатором, то осуществляется поиск этой лексемы в таблице
ключевых слов ТКС подпрограммой ZAPTAB(TKC,LE,ALE,REZ). Если эта LЕ есть в ТКС, значит
лексема является ключевым словом, она не записывается в ТКС, а осуществляется её запись в
таблицу стандартных символов ТСС подпрограммой OUT(TLE,ALE). Если же эта LЕ отсутствует в
таблице ТКС, то подпрограмма ZAPTAB(TИ,LE,ALE,REZ) записывает её в таблицу
идентификаторов ТИ, если её ещё там нет, а подпрограмма OUT(TLE,ALE) - в таблицу ТСС.
При появлении ошибки разбор текущей лексемы прекращается, она не включается в ТСС, а
очередная текущая литера рассматривается в качестве первого символа следующей лексемы.
Вывод:
В ходе данной лабораторной работы я научился разрабатывать сканер под заданную
грамматику, анализировать лексемы, строить таблицы лексических единиц, как
постоянные, так и временные, и конечные автоматы для работы с грамматикой.