Дизайн компилятора - Лексический анализ

Лексический анализ - это первая фаза компилятора. Он принимает модифицированный исходный код от языковых препроцессоров, которые написаны в форме предложений. Лексический анализатор разбивает эти синтаксисы на серию токенов, удаляя любые пробелы или комментарии в исходном коде.

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

Токен, передаваемый в компилятор

Лексемы

Лексемы называются последовательностью символов (буквенно-цифровых) в токене. Есть несколько предопределенных правил для каждой лексемы, которая будет определена как действительный токен. Эти правила определяются грамматическими правилами посредством шаблона. Шаблон объясняет, что может быть токеном, и эти шаблоны определяются с помощью регулярных выражений.

В языке программирования ключевые слова, константы, идентификаторы, строки, числа, операторы и символы пунктуации могут рассматриваться как токены.

Например, в языке C строка объявления переменной

int value = 100;

содержит токены:

int (keyword), value (identifier), = (operator), 100 (constant) and ; (symbol).

Характеристики токенов

Давайте поймем, как теория языка принимает следующие термины:

алфавиты

Любой конечный набор символов {0,1} является набором двоичных алфавитов, {0,1,2,3,4,5,6,7,8,9, A, B, C, D, E, F} представляет собой набор шестнадцатеричных алфавитов, {az, AZ} представляет собой набор алфавитов английского языка.

Струны

Любая конечная последовательность алфавитов называется строкой. Длина строки - это общее количество вхождений алфавитов, например, длина строки tutorialspoint равна 14 и обозначается как | tutorialspoint | = 14. Строка, не имеющая алфавитов, то есть строка нулевой длины, называется пустой строкой и обозначается ε (эпсилон).

Специальные символы

Типичный язык высокого уровня содержит следующие символы:

Арифметические символы Сложение (+), Вычитание (-), Модуль (%), Умножение (*), Деление (/)
пунктуация Запятая (,), точка с запятой (;), точка (.), Стрелка (->)
присваивание знак равно
Специальное Назначение + =, / =, * =, - =
сравнение ==,! =, <, <=,>,> =
препроцессор #
Спецификатор местоположения &
логический &, &&, |, ||,!
Оператор смены >>, >>>, <<, <<<

язык

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

Правило самого длинного матча

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

Например:

int intvalue;

При сканировании обеих лексем до «int» лексический анализатор не может определить, является ли это ключевое слово int или инициалы значения идентификатора int.

Правило самого длинного совпадения гласит, что отсканированная лексема должна определяться на основе самого длинного совпадения среди всех доступных токенов.

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