Программирование лексических анализаторов
Рассмотрим для примера следующую схему лексического анализа.
Исходные данные и структуры
Имеется входная цепочка символов. Пустая таблица имен. И 3 множества символов
• LA – множество символов латинского алфавита.
• TZ – Множество знаков, являющихся терминалами языка
• SP – Множество пробельных символов
• ZPR – Множество знаков препинания (ZPR=SP U TZ).
Общая схема работы лексического анализатора такова.
• Сначала выделяем отдельную лексему (используя множества ZPR и TZ).
• Если выделенная лексема – ограничитель, то он выдается как результат лексического анализа.
• Если это идентификатор, то делается проверка на принадлежность его множеству ключевых слов. Если да, то выдается признак соответствующего ключевого слова, если нет – выдается лексема идентификатора. Сам идентификатор сохраняется в таблице имен, если его еще там нет. В лексему помещается ссылка на таблицу имен.
• Если выделенная лексема принадлежит какому-либо из других классов лексем (число, строка и т.д.), то выдается признак лексема соответствующего класса, а значение лексемы сохраняется в качестве признака или в таблице имен.
Лексический анализатор может работать или как самостоятельная фаза трансляции, или как подпрограмма, работающая по принципу “дай лексему”. В первом случае выходом лексического анализатора является файл лексем, во втором лексема выдается при каждом обращении к лексическому анализатору. Второй случай может быть предпочтительней, т.к. тогда синтаксический и лексический анализатор могут работать более слажено. Скажем синтаксический анализатор сообщает лексическому о возможности появления нового идентификатора или нет. Что улучшает обработку ошибок и позволяет проставить некоторые атрибуты лексем до контекстного анализа.
Лексический анализатор, как правило, вызывается как подпрограмма. В результате обращения к ЛА вырабатываются как минимум два результата: тип выбранной лексемы и указатель на элемент таблицы или значение – для классов лексем (идентификаторов, чисел, строк и т.д.). Само значение передается, если ЛА не ведет таблицу литералов.
Если ЛА реализован отдельным проходом, то он должен передавать сразу все лексемы программы. Например, через массив или файл. Если он возвращает по одной лексеме, то через параметры.
В некоторых языках (например, ПЛ/1 или Фортран) ключевые слова могут использоваться в качестве обычных идентификаторов. В этом случае работа ЛА не может идти независимо от работы синтаксического анализатора, т.к. только окружающего контекста зависит, является ли лексема оператором или переменной.
Похожие записи
No user прокомментировали сообщение
Оставить комментарий