Сборник по задачам и примерам Assembler

     

«Склеивание» конечных автоматов для всех классов лексем



«Склеивание» конечных автоматов для всех классов лексем

Мы не будем пытаться получить склеенный автомат, учитывающий все возможные случаи синтаксиса строки с командой ассемблера. Попытаемся получить объединенный конечный автомат для анализа типичной строки программы с ХММ-командой. С учетом этих упрощений «склеенный» конечный автомат может выглядеть так, как показано на Рисунок 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.



    Содержание раздела