2.3 Схема распознавателя
Описанный выше входной язык может быть построен с помощью регулярного языка G({for, do, <, >, =, a, :=, (, ), ;}, {S, F, T, E}, P, S) с правилами P:
S → F;
F → for (T) do F│a:=a
T → F;E;F│;E;F│F;E;│;E;
E → a<a│ a>a│ a=a
Лексемами данного языка являются:
идентификаторы;
разделители: открывающая и закрывающая круглые скобки, точка с запятой;
знаки арифметических операций и знак присваивания;
римские числа.
Под идентификатором понимается произвольная последовательность малых и прописных букв латинского алфавита (от A до Z и от a до z), цифр (от 0 до 9) и знака подчеркивания.
Граф конечного детерминированного автомата, используемого для распознавания входных цепочек языка, представлен на рисунке 1 в приложении Б.
Начальное и конечное состояния при нормальной работе лексического анализатора совпадают (на рисунке состояние "q"). В случае ошибочной входной цепочки автомат попадает в состояние ошибки ERROR. При этом работа автомата останавливается.
Кроме того, типичными для автомата являются состояния ID (переменная) и CONSTANT (константа). Остальные состояния автомата определяются допустимыми для компилятора исходного языка лексемами.
Каждый переход в конечное состояние "q" сообщает о конце текущей входной цепочки. В этом случае производится анализ распознанной цепочки и перезапуск автомата для очередной входной цепочки символов. Заметим также, что возможна повторная обработка некоторых символов входной цепочки символов. Это необходимо в тех случаях, когда символ, приведший к переходу автомата в конечное состояние, является началом следующей цепочки символов.
2.4 Результаты
Текст входной программы:
for ( srt := qwer ; qwa = a ; rt := 12312.2314e1 ) do wet := 12312.2314e1 ;
Построен лексический анализатор на основе конечного автомата. Построенный лексический анализатор позволяет выделять в тексте исходной программы лексемы следующих типов:
идентификаторы;
константы;
знаки операций;
разделители;
Лексический анализатор игнорирует в тексте входной программы пробелы, знаки табуляции и переводы строки. В случае обнаружения неверной лексемы лексический анализатор выдает сообщение об ошибке и прекращает дальнейший анализ. При наличии нескольких неверных лексем анализатор обнаруживает только первую из них. Результатом выполнения лексического анализатора является структура данных, которая представляет собой таблицу лексем.
Таблица 1. Таблица лексем
|
Строка |
Хэш/Символ терминал |
Значение |
Тип |
|
for |
for |
for |
Ключевое слово |
|
( |
( |
( |
Ключевое слово |
|
srt
|
a |
srt
|
Идентификатор |
|
:= |
:= |
:= |
Знак присвоения |
|
qwer |
a |
qwer |
Идентификатор |
|
; |
; |
; |
Ключевое слово |
|
qwa |
a |
qwa |
Идентификатор |
|
= |
= |
= |
Условие |
|
a |
a |
a |
Идентификатор |
|
; |
; |
; |
Ключевое слово |
|
rt |
a |
rt |
Идентификатор |
|
:= |
:= |
:= |
Знак присвоения |
|
12312.2314e1 |
a |
12312.2314e1 |
Константа |
|
) |
) |
) |
Ключевое слово |
|
do |
do |
do |
Ключевое слово |
|
wet |
a |
wet |
Идентификатор |
|
:= |
:= |
:= |
Знак присвоения |
|
12312.2314e1 |
a |
12312.2314e1 |
Константа |
|
; |
; |
; |
Ключевое слово |
