Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все_пособие_редактир.doc
Скачиваний:
182
Добавлен:
31.10.2018
Размер:
2.51 Mб
Скачать

2.2 Атрибуты лексем

Если шаблону соответствует несколько лексем, лексический анализатор должен обеспечить дополнительную информацию о лексемах для последующих фаз компиляции. Например, шаблон num ( рис.4) может соответствовать как строке 3.1416, так и 2.19, и при генерации кода крайне важно знать, какая именно строка соответствует шаблону.

Лексический анализатор хранит информацию о лексемах и связанных с ними атрибутах. На практике лексемы обычно имеют единственный атрибут – указатель на запись в таблице символов, в которой хранится информация о соответствующей лексеме. Для диагностических целей могут понадобиться как лексемы идентификаторов, так и номера строк, в которых они впервые появились в программе. Вся эта (и другая) информация может храниться в записях в таблице символов.

Пример 2

Лексемы и связанные с ними значения атрибутов для инструкции

E = M * 2

записываются как последовательность пар:

<id, указатель на запись в таблице символов для E>

<assign_op,>

<id, указатель на запись в таблице символов для M>

<mult_op,>

<num, целое значение 2>

В некоторых парах нет необходимости в значении атрибута – первого компонента вполне достаточно, чтобы идентифицировать лексему. В этом примере лексема num задана атрибутом с целым значением. Компилятор может хранить строку символов, составляющих число, в таблице символов, сделав, таким образом, атрибут лексемы num указателем на запись в таблице символов.

2.3 Общие принципы построения лексических анализаторов

Лексический анализатор имеет дело с такими объектами, как различного рода константы и идентификаторы (к последним относятся и ключевые слова). Язык констант и идентификаторов в большинстве случаев является регулярным — то есть может быть описан с помощью регулярных грамматик. Распознавателями для регулярных языков являются конечные автоматы. Существуют правила, с помощью которых для любой регулярной грамматики может быть построен недетерминированный конечный автомат, рас­познающий цепочки языка, заданного этой грамматикой. Конечный автомат для каждой входной цепочки языка дает ответ на вопрос о том, принадлежит или нет цепочка языку, заданному автома­том.

В общем случае задача сканера несколько шире, чем просто проверка цепочки символов лексемы на соответствие ее входному языку. Кроме этого, сканер должен выполнить следующие действия:

  • четко определить границы лексемы, которые в исходном тексте явно не заданы;

  • выполнить действия для сохранения информации об обнаруженной лексеме (или выдать сообщение об ошибке, если лексема неверна).

2.4 Определение границ лексем

Выделение границ лексем представляет определенную проблему. Ведь во вход­ном тексте программы лексемы не ограничены никакими специальными симво­лами. Определение границ лексем – это выделение тех строк в общем потоке входных символов, для которых надо выполнять распознавание. B общем случае эта задача может быть сложной и тогда требуется параллельная работа лексического анализатора, синтаксического разбора и, возможно, - семантического анализа. Для большинства входных языков границы лексем распознаются по заданным терминальным символам. Эти символы – пробелы, знаки операций, символы комментариев, а также разделители (запятые, точки с запятой и т.п.) Набор таких терминальных символов может варьироваться в зависимости от синтаксиса входного языка.

Как правило, лексические анализаторы действуют по следующему принципу:

  1. очередной символ из входного потока данных добавляется в лексему всегда, когда он может быть туда добавлен;

  2. как только символ не может быть добавлен в лексему, то считается, что он является границей лексемы и началом следующей лексемы.

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