Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Лабораторна робота №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
LE TLE
Идент. 0
Кл. слово 1
Конст. 2
Однолитерн. разделит. 3
Двухлитерн. разделит. 4
2. Временные таблицы
Односимв. разд:
S = "*"| "+"| "%"| "/"| "!"| ","| ">"| "<"| "="| "("| ")"
Двухсимвольные разделители:
S = "&"R1| "<"R2| ">"R2| "="R2
R1 = "&"
R2 = "="
4. Обобщенный конечный автомат:
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) - в таблицу ТСС.
При появлении ошибки разбор текущей лексемы прекращается, она не включается в ТСС, а
очередная текущая литера рассматривается в качестве первого символа следующей лексемы.
Вывод:
В ходе данной лабораторной работы я научился разрабатывать сканер под заданную
грамматику, анализировать лексемы, строить таблицы лексических единиц, как
постоянные, так и временные, и конечные автоматы для работы с грамматикой.