- синтаксический анализатор; ЛА лексический анализатор; ГК генератор кода; СемА семантический анализат.

Работа добавлена: 2018-07-05






30 Упрощённая модель компилятора. Блоки и проходы компилятора

СА- синтаксический анализатор; ЛА – лексический анализатор; ГК – генератор кода; СемА – семантический анализатор.

Исходный текст программы обрабатывает ЛА. Основное назначение ЛА – разбить исходный текст, представляющий собой последовательность символов, на слова или лексемы. После этого исходная программа представляет собой последовательность слов, которые будет обрабатывать СА. Кроме разбиения исходного текста на слова, ЛА проверяет правильность написания каждого слова, то есть обнаруживает лексические ошибки в программе. Для ЛА порядок слов не имеет значения.

СА определяет, является ли синтаксически правильной последовательность слов, полученная ЛА. Если последовательность слов не верная, то в программе есть синтаксическая ошибка. Если ошибок нет, то СА переводит последовательность слов в последовательность лексем в таком представлении прогшраммы, в котором удобно использовать при генерации кода. Например, если рассматривать арифметические выражения, то ЛА разбивает его на операции, операнды и скобки, а СА может преобразовать исходное арифметическое выражение в обратную польскую запись или 3х адресный код. Эти формы удобны для ГК, так как они записаны в той последовательности, в которой они должны выполняться.

ЛА и СА машинно-независимы. ГК переводит полученные данные в программу для конкретной машины. ГК может содержать оптимизатор кода, который преобразует последовательность команд в такую, которая получает тот же результат, но работает более эффективно. СА и ГК содержат семантический анализатор. СемА может генерировать различный код для вычисления значений выражений в зависимости от типов операндов. СемА проверяет семантические соглашения исходного языка. Если они нарушены, то объектный код не может быть получен. Пример семантического соглашения:

  1. каждый идентификатор должен быть описани и только один раз;
  2. каждый идентификатор должен быть описан до его использования;
  3. соблюдение согласования типов в выражениях, в операторах присваивания;
  4. соблюдение согласованности параметров подпрограмм.

1) каждый идентификатор должен быть использован;

2) использованию переменной должна предшествовать ее инициализация;

3) результат функции должен быть определен при ее выполнении;

4) каждый оператор должен иметь возможность выполниться.

Основной блок – СА. Он может выполнять функции и ЛА и ГК. Наличие ЛА позволяет:

Взаимодействие блоков компилятора: параллельное и последовательное. Рассмотрим ЛА и СА. При последовательном взаимодействии блоков ЛА обрабатывает весь текст исходной программы и создает таблицу лексем, каждая строка таблицы – лексема и порядок следования лексем таблицы совпадает с порядком следования лексем в исходном тексте, затем СА обрабатывает эту таблицу.

При параллельном взаимодействии работает СА, и если ему нужна очередная лексема, он обращается к ЛА, который ее выделяет и передает СА. После ее обработки СА опять обращается к ЛА и тд.

Аналогично могут взаимодействовать ГК и СА. В зависимости от взаимодействия блоков компиляторы могут быть однопроходные и многопроходные. Проход – процесс последовательного чтения данных из внешней памяти, их обработка и помещение результата во внешнюю память. Если блоки взаимодействуют последовательно, то требуется 3 прохода ЛА-> СА->ГК. Если параллельно, то один проход ГК-СА-ЛА. Возможны двухпроходные схемы ЛА<->СА->ГК или ЛА-СА<->ГК.

ЛА-первая фаза программной обработки языков. Читает символы программы на исходном я зыке и строит лексемы (слова) исходного языка. Лексема – структурная единица языка, которая состоит из символов алфавита и не содержит в себе других структурных единиц языка. Лексемами языка программирования являются цепочки символов, представляющие собой идентификаторы, константы, ключевые слова, знаки операции и тд. Каждая лексема имеет тип и, возможно, значение, позволяющее отличить ее от другой лексемы того же типа. Последовательность типов лексем обрабатывается СА. Значением лексемы типа идентификатор может быть ссылка на элемент таблицы идентификаторов, которая хранит основные характеристики идентификаторов. Для переменной это может быть: имя, ее тип, область памяти ну и тп. Не все характеристики идентификаторов могут быть определены ЛА. Например, для переменной, ее имя может быть определено ЛА, а тип- нет. Тип может быть определен СА, а область памяти – ГК.

ЛА может представлять собой подпрограмму – функцию, которая возвращает тип очередной выделенной лексемы, а значение заносит в некоторую глобальную переменную. Подпрограмма ЛА может вызывать СА при параллельном взаимодействии, и тип, и значение сразу обрабатываются СА. При последовательном взаимодействии эта подпрограмма вызывается многократно, пока не будет обработан текст программы или не найдена ошибка. На каждом шаге тип лексем и ее значения заносятся в таблицу лексем. Порядок следования лексем в таблице такой же, как в исходной программе. Например, если ЛА обрабатывает цепочку for i:=15 to n*(m-k) do таблица лексем будет иметь следующий вид:

имя

тип

значение

for

key for

-

i

id

:=

op :=

-

15

const

15

to

key to

-

n

id

*

mul

1 (по номеру операции)

(

(

-

m

id

-

add

2

k

id

)

)

-

имя

параметры

i

n

m

k

Ла может при его вызове из очередной последовательности символов создать лексемму. Такой анализатор называется прямым. Непрямому ЛА задается тип лексемы, которая определяет действие «распознать» на очередном шаге. Такой анализатор возвращает истину, если очередная последовательность обрабатываемых символов – есть лексемы заданного типа, и ложь иначе. Непрямой ЛА (НЛА) вызывается из СА. Если ЛА возвращает ложь, возможно, СА опять обратиться к ЛА с другим типом лексемы, тогда ЛА будет заново обрабатывать ту же последовательность символов с целью формирования лексемы другого типа. НЛА может быть использован при параллельном взаимодействии с СА, когда одна последовательность символов может представлять собой различные лексемы, в зависимости от ее окружения. Кроме основной задачи выделения лексем, ЛА выполняет также и другие задачи, например: удаление из исходной программы комментариев, удаление пустых символов и тп, также обнаружение ошибок (лексических и синтаксических), например:

  1. ЛА проверяет парность лексем (if…then, (), и тп). Для того, чтобы обнаружить такого типа ошибки, используется массив. Индекс массива соответствует паре лексем. Сначала все элементы массива равны 0, далее, если встречается первый элемент пары соответствующий элемент массива увеличивается на 1, если второй элемент пары -  уменьшается на 1. Если после обработки всего текста исходной программы все элементы такого массива равны 0, то этого типа синтаксических ошибок в программе нет, если хотя бы один элемент не равен нулю, то может быть выдано сообщение об ошибке, чего и сколько не хватает.
  2. Сочетаемость/порядок ключевых слов. (заforto, заwhiledo и тп). Для обнаружения таких ошибок используется матрица, в которой строки и столбцы соответствуют ключевым словам. Если заi-тым может следовать  j – ое ключевое слово, то табл[i,j] =1 и 0 иначе. Для того,чтобы обнаружить ошибку такого типа, нужно знать предыдущее ключевое слово. После прочтения очередного ключевого слова – обращение к элементу матрицы, и если он равен нулю – есть ошибка.
  3. Сочетаемость рядом стоящих лексем. Например, после for может быть идентификатор, но не наоборот. Для обнаружения можно составить матрицу, как в 2.
  4. Согласование местоположения ошибки, лексической или синтаксической и текста исходной программы.
  5. Можно выполнить простейший синтаксический анализ. Например, распознавание унарного минуса, а не бинарного, так как с точки зрения ЛА – это одна и та же лексема.

ЛА

СА

ГК

таблица




Возможно эти работы будут Вам интересны.

1. -трансляторов. Для СА синтаксический анализатор используется автомат с магазинной стековой

2. Слуховой анализатор играет немаловажную роль в восприятии движений собственного тела: например с его помощ.

3. Определение маркировочного кода контейнера

4. Балама генератордың параметрлерін анықтау. Балама генератор әдісімен электр тізбектерді есептеу

5. Для защиты от изучения алгоритма работы фрагмента кода демонстрационных версий защищаемой программы, в котором происходит сравнение текущей даты