Системное программное обеспечение: Основы трансляции. Карпушин А.Н - 31 стр.

UptoLike

33
работы непосредственно с текстом исходной программы, структура кото-
рого может варьироваться в зависимости от версии входного языкапри
такой конструкции компилятора для перехода от одной версии языка к
другой достаточно перестроить относительно простой лексический ана-
лизатор.
В основном лексические анализаторы выполняют исключение из текста
исходной программы комментариев, незначащих пробелов, символов табуля-
ции и перевода строки, а также выделение лексем следующих типов: иденти-
фикаторов, строковых, символьных и числовых констант, ключевых (служеб-
ных) слов входного языка, знаков операций и разделителей.
В простейшем случае фазы лексического и синтаксического анализа могут
выполняться компилятором последовательно. Но для многих языков програм-
мирования на этапе лексического анализа может быть недостаточно информа-
ции для однозначного определения типа и границ очередной лексемы. Приме-
ром может служить оператор языка С, имеющий вид:
k=i+++++j.
Существует только одна единственно верная трактовка этого оператора:
k = i++ + ++j (если явно пояснить ее с помощью скобок, то данная конструкция
имеет вид: k = (i++) + (++j)).
Однако найти ее лексический анализатор может, лишь просмотрев весь
оператор до конца и перебрав все варианты, причем неверные варианты могут
быть обнаружены только на этапе семантического анализа (например, вариант
k = (i++)++ + j; является синтаксически правильным, но семантикой языка С не
допускается). Конечно, чтобы эта конструкция была в принципе допустима,
входящие в нее операнды k, i и j должны быть описаны и должны допускать
выполнение операций языка ++ и +.
Поэтому в большинстве компиляторов лексический и синтаксический ана-
лизаторыэто взаимосвязанные части. Возможны два принципиально различ-
ных метода организации взаимосвязи лексического анализа и синтаксического
разбора: последовательный и параллельный.
При последовательном варианте лексический анализатор просматривает
весь текст исходной программы от начала до конца и преобразует его в струк-
турированный набор данных. Этот набор данных называют также таблицей
лексем. В таблице лексем ключевые слова языка, идентификаторы и константы,
как правило, заменяются на специально оговоренные коды, им соответствую-
щие (конкретная кодировка определяется при реализации компилятора). Для
идентификаторов и констант, кроме того, устанавливается связь между табли-
цей лексем и таблицей идентификаторов, которая заполняется параллельно.
В этом варианте лексический анализатор просматривает весь текст исход-
ной программы один раз от начала до конца. Таблица лексем строится полно-
стью вся сразу, и больше к ней компилятор не возвращается. Всю дальнейшую
обработку выполняют следующие фазы компиляции.
При параллельном варианте лексический анализ исходного текста выпол-
няется поэтапно так, что синтаксический анализатор, выполнив разбор очеред-
ной конструкции языка, обращается к сканеру за следующей лексемой. При