Информационно-безопасные системы. Анализ проблемы: Учебное пособие, страница 31

2)  Для цикла с предусловием польская запись имеет вид:

2.  м1:  Условие УПнет(м2)  Посл-ть блоков  БПУ(м1)  м2:

3)  Для оператора присваивания польская запись имеет вид:

3.  Идентификатор   Выражение   Присвоить

Здесь использованы следующие обозначения:

УПнет(м1) - условный переход на метку м1, если условие не выполняется;

БПУ(м1) - бесусловная передача управления на метку м1;

м1 и м2 метки перехода.

8.4. Построение транслятора

Транслятор будет строится на основе упрощенной модели компилятора, описанной в разделе 7, за исключением того, что в нем будет отсутствовать блок генератора кода.

8.4.1. Построение лексического блока на основе конечного автомата

Лексический блок будет строиться на основе конечного автомата.

Рассмотрим некоторые проблемы, связанные с реализацией этого конечного автомата как программы для вычислительной машины [3-5].

При процедуре чтения символов исходной программы может возникнуть проблема кодировки входного множества лексического блока. Если множество символов исходной программы непосредственно служит входом для лексического блока, содержащего много состояний, то этот блок имеет огромную таблицу переходов из-за большого числа входных символов. Решение этой проблемы заключается в обработке исходных символов транслитератором перед подачей на вход лексического блока (рис.8.5). Задача транслитератора - сократить входное множество до приемлемых размеров.

Транслитератор преобразует каждый входной символ в символьную лексему, кото­рая состоит из двух частей: класса и значения. Например, символ а преобразуется в лексему БУКВА.а. Транслитератор реализуется как процедура, которая находит в таблице перевод для каждого входного символа.

 


Для нашего случая транслитератор осуществляет перевод входных символов в сим­вольные лексемы так как показано в таблице 8.2.

Задача лексического блока заключается в распознавании конечного множества слов и создании соответствующей лексемы, которая подается на вход синтаксического блока. Множество лексем, выдаваемых лексическим блоком для выбранного языка, по­казано в таблице 8.3.

Суть проблемы распознавания состоит в том, что компилятор должен обнаружить появление некоторого слова из заданного множества и затем действовать в зависимости от того  какое это слово. Задача такого характера называется проблемой идентификации.

Существуют проблемы идентификации, которые, строго говоря, не могут быть ре­шены с помощью конечного автомата. Например, для языков, где число допустимых идентификаторов бесконечно или практически бесконечно, невозможно отвести место в памяти или элемент таблицы имен для каждого возможного идентификатора. Эта проблема решается с помощью расширяющегося конечного автомата. При считывании

Таблица 8.2.

Входной символ транслитератора

символьная лексема

класс

Значение

A-Z

0-9

+

*

=

(

)

:

EOF

БУКВА

ЦИФРА

ОПЕРАЦИЯ

ОПЕРАЦИЯ

ОТНОШЕНИЕ

ОТНОШЕНИЕ

ОТНОШЕНИЕ

ЛЕВ.СКОБКА

ПРАВ.СКОБКА

ДВОЕТОЧИЕ

ПРОБЕЛ

КОН.ФАЙЛА

1 -26

0-9

1

2

1

2

3

-

-

-

Таблица 8.3.

ЛЕКСЕМА

КЛАСС

ЗНАЧЕНИЕ

КОНСТ

ИДЕНТ

ОПЕРАЦИЯ

ОТНОШЕНИЕ

ПРИСВ

IF

THEN

ENDIF

WHILE

DO

ENDWHILE

BEGIN

END

ОШИБКА

указатель на таблицу имен

указатель на таблицу имен

номер операции

номер отношения

Нет

Нет

Нет

Нет

нет

нет

нет

нет

нет

нет

входной цепочки этот автомат отводит для идентификатора необходимое место в памя­ти и элемент в таблице, как только тот впервые встречается в программе.

Несмотря на то, что в рассматриваемой задаче число идентификаторов не так велико, будем строить лексический блок на основе расширяющегося конечного автомата.

Состояние автомата может быть представлено явно и неявно. В первом случае в некоторой ячейке памяти запоминается номер, соответствующий текущему состоянию. При неявном представлении для каждого состояния имеется отдельная часть програм­мы. Для решаемой задачи выбираем неявное представление состояний.