Опубликован: 23.07.2006 | Уровень: специалист | Доступ: платный
Лекция 5:

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

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >
Аннотация: Основные задачи лексического анализа. Регулярные выражения. Использование конечных автоматов для лексического анализа. Утилита Lex. Использование механизма регулярных выражений .NET

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

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

Размеры лексических классов различны. Например, лексический класс идентификаторов, вообще говоря, бесконечен. С другой стороны, есть лексические классы, состоящие только из одной лексемы, например, подмножество, состоящее из лексемы if. В большинстве языков программирования имеются следующие лексические классы: ключевые слова (по одному на каждое ключевое слово), идентификаторы, строковые литералы, числовые константы. Каждому подмножеству сопоставляется некоторое число, называемое идентификатором лексического класса (token) или, короче, лексическим классом.

Пример. Рассмотрим оператор языка Pascal const pi = 3.1416; Этот оператор состоит из следующих лексем:

  • сonst - лексический класс Const_LC
  • pi - лексический класс Identifier_LC
  • = - лексический класс Relation_LC
  • 3.1416 - лексический класс Number_LC
  • ; - лексический класс Semicolon_LC

Лексический анализ различных языков программирования

Некоторые языки обладают особенностями, существенно затрудняющими лексический анализ. Такие языки, как Фортран и Кобол, требуют размещения конструкций языка в фиксированных позициях входной строки. Такое размещение лексем могло быть очень важным при выяснении корректности программы. Например, при переносе строки в Коболе необходимо поставить специальный символ в 6-й колонке, иначе следующая строка будет разобрана неправильно. Основной тенденцией современных языков программирования является свободное размещение текста программы.

От одного языка к другому варьируются правила использования символов языка, в частности, пробелов. В некоторых языках, таких как Алгол 68 и Фортран, пробелы являются значащими только в строковых литералах. Рассмотрим популярный пример, иллюстрирующий потенциальную сложность распознавания лексем в Фортране. В операторе DO 5 I = 1.25 мы не можем определить, что DO не является ключевым словом до тех пор, пока не встретим десятичную точку.

С другой стороны, в операторе DO 5 I = 1,25 мы имеем семь лексем: ключевое слово DO, метку 5, идентификатор I, оператор =, константу 1, запятую и константу 25. Причем, до тех пор пока мы не встретим запятую, мы не можем быть уверены в том, что DO - это ключевое слово. Чтобы как-то разрешить эту ситуацию, Fortran 77 позволяет использовать необязательную запятую между меткой и индексом DO оператора. Использование такой запятой позвляет сделать DO оператор понятнее и более читабельным.

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

IF THEN THEN THEN  = ELSE; ELSE ELSE = THEN;

При разборе такого оператора необходимо постоянно переключаться с режима " THEN, ELSE как ключевые слова" на трактовку " THEN, ELSE как идентификаторы", и обратно.

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >
Вероника Стрельская
Вероника Стрельская
Россия
Сергей Покаляев
Сергей Покаляев