Лексический анализ

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

Во многих ситуациях выбор конструкций, которые будут выделяться как лексемы, довольно произволен. Например, если в языке разрешены комплексные константы вида

<комплексная константа> (< вещественное>,<вещественное>)

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

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

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

Определим два крайних подхода к лексическому анализу. Большинство известных способов основано на том или другом из этих подходов, а некоторые на их комбинации:

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

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

Вообще мы будем описывать алгоритмы синтаксического анализа в предположении, что лексический анализ прямой. В случае непрямого лексического анализа можно использовать «недетерминированные» алгоритмы или алгоритмы с возвратами.