Главная arrow Программирование С++ arrow Разбиение исходного кода на лексемы

Разбиение исходного кода на лексемы

Фундаментальным для всех интерпретаторов (и компиляторов в этом смысле) является механизм разбиения исходного кода на составляющие элементы, называемые лексемами. Лексема — это неделимая часть программы, представляющая одну логическую единицу. Примерами лексем могут служить {,+,== и if. Хотя операция равенства и обозначается двумя символами, их нельзя разделить, не изменив при этом их значения. Следовательно, комбинация == — это одна логическая единица, или лексема. Точно так же if представляет собой лексему, а отдельно i или f в языке С++ специального значения не имеют.
Стандарт С++, разработанный ANSI/ISO, определяет следующие типы лексем:
? keywords (ключевые слова);
? identifiers (идентификаторы);
? literal (литерал);
О operator (операция);
О punctuator (знак пунктуации).
Ключевые слова — это лексемы, которые формируют язык С++, например, while. Идентификаторы — это имена переменных, функций и т. д. К литералам относятся строки и значения констант, такие как 10. Операции не требуют дополнительных пояснений. Категория знаков пунктуации включает в себя точку с запятой, запятую, фигурные и круглые скобки (некоторые знаки пунктуации в зависимости от их применения служат также знаками операций).
Несмотря на то, что интерпретатор Mini С++ распознает те же лексемы которые описаны в стандарте ANSI/ISO для языка С++, он несколько иначе делит их на категории для облегчения процесса интерпретации. В табл. 9.2 приведены категории лексем, используемые в интерпретаторе Mini С++.
Функция get_token() начинается с пропуска всех пробелов, табуляций, пустых строк, возвратов каретки и переводов строки. Поскольку ни одна лексема не содержит пробелов (за исключением строки в кавычках и символьной константы), их следует игнорировать. Функция get_token() также пропускает комментарии. Затем читается очередная лексема из программы. Обратите внимание на то, как обрабатывается каждый тип лексемы. Например, если очередной символ в программе — цифра, читается число; если следующий символ — буква, извлекается идентификатор или ключевое слово, и т. д.
Строковое представление лексемы помещается в переменную token. Прочитанный тип лексемы (в соответствии с именем, указанным в перечислимом типе tok_types) передается переменной token_type, и если лексема — ключевое слово, ее внутреннее представление (в соответствии с наименованием, приведенным в перечислимом типе token_ireps) присваивается переменной tok с помощью функции iook_up() (необходимость представления ключевых слов во внутреннем формате будет объяснена позже). Как видите, функция get_token() преобразует двухсимвольные знаки операций языка С++, такие как <= или ++, в соответствующие значения перечислимого типа. Хотя в этом нет технической необходимости, подобный шаг упрощает реализацию интерпретатора.