Выделение классов лексем
"Склеивание" конечных автоматов для всех классов лексем
Мы не будем пытаться получить склеенный автомат, учитывающий все возможные случаи синтаксиса строки с командой ассемблера. Попытаемся получить объединенный конечный автомат для анализа типичной строки программы с ХММ-командой. С учетом этих упрощений "склеенный" конечный автомат может выглядеть так, как показано на рис. 10.2.
Рис. 10.2. Упрощенный вариант "склеенного" конечного автомата
Для представленного на рисунке склеенного конечного автомата таблица (матрица) переходов показана ниже.
L D [ ] пробел SO SI S2 S4 S4 SO S6 SI SI SI S5 S4 со S2 S2 S4 S3 S4 S5 S3 S3 S3 S3 S3 S3 S4 S6 SG S6 S6 S6 S6 S6 S6 S6
Как обычно, два из этих состояний являются конечными:
- S3 – состояние ошибки;
- S4 – конечное состояние.
Состояние S6 – состояние, соответствующее комментарию, то есть допустимы любые символы. Ограничение комментария – конец строки. Строки в таблице переходов соответствуют состояниям склеенного конечного автомата, основа столбцов – классы лексем. Логика работы сканера с использованием таблицы переходов описана в главе 2.
После заполнения таблицы переходов можно навешивать семантику на " дуги" переходов из одного состояния в другое. Основная задача при этом – не брать на себя ничего лишнего. Главное – локализовать поле с названием команды, определить принадлежность ее к группе ХММ-команд. Если это не так, то дальнейший процесс сканирования строки можно прекращать, копировать ее в выходной поток (пусть транслятор ассемблера разбирается с ней сам) и переходить к анализу очередной строки исходного текста ассемблерной программы.
В самом простом случае нашу задачу можно решить легко – в очередной строке выделить метку, если она есть, затем выделить название команды, и если она является ХММ-командой, то продолжить обработку строки. Если очередная строка не является ХММ-командой, то копируем ее полностью в выходной файл. Если очередная строка – ХММ-команда, то локализуем операнды и определяем их тип. По крайней мере один из операндов должен быть регистром. Если строка синтаксически верна для конкретной ХММ-команды, то формируем ее аналог, понятный для восприятия используемым нами транслятором ассемблера. Этот процесс может быть похожим на первый способ формирования ХММ-команд с помощью включаемого файла iaxmm.inc.
Синтаксический анализ
Если веденная строка исходной программы является строкой с ХММ-командой, то необходимо получить ее лексическую свертку для проведения синтаксической проверки и подготовки к дальнейшему преобразованию. Здесь простор для творческих изысканий весьма велик. Поэтому мы не будем повторять соответствующий материал главы 2, а обратимся к тексту программы, который выполняет такое преобразование. Его описание содержит множество технических подробностей, не относящихся к предмету книги. По этой причине программа-препроцессор с соответствующими пояснениями деталей реализации вынесена на дискету, прилагаемую к книге. Протестировать эту программу вы можете на примерах программ с ХММ-командами, приведенными в первой части данной главы.