Лексический анализ
Материал из Википедии — свободной энциклопедии
[править] Лексический анализ
В информатике лексический анализ — процесс обработки входной последовательности символов (например, такой как исходный код на одном из языков программирования) с целью получения на выходе последовательности символов, называемых «лексическими токенами» или просто токенами. Например, последовательность символов 123 abc
конвертируется в последовательность из двух токенов: 123
и abc
(пробел обычно не выделяется в отдельный токен). Цель такой конвертации обычно состоит в том чтобы подготовить входную последовательность для другой программы, например, для парсера.
[править] Лексический анализатор
Лексический анализатор (англ. lexical analyzer или коротко lexer) — это программа или часть программы, выполняющая лексический анализ. Лексический анализатор обычно работает в две стадии: сканирование и оценка.
На первой стадии, сканировании, лексический анализатор обычно реализуется в виде конечного автомата. В нём кодируется информация о возможных последовательностях символов, которые могут встречаться в токенах (такие отдельные последовательности, составляющие токены, называются лексемами). Например, токен «целое число» может содержать любую последовательность десятичных цифр. Во многих случаях первых непробельный символ может использоваться для определения типа следующего токена, после чего входные символы обрабатываются один за другим пока не встретится символ, не входящий во множество допустимых символов для данногоо токена. В некоторых языках правила разбора лексем несколько более сложные и требуют возвратов назад по читаемой последовательности.
Лексема — это лишь последовательность символов определённого типа. Для того чтобы сконструировать токен, лексический анализатор проходит вторую стадию — оценку, в ходе которой выполняется проход по символам лексемы для того чтобы получить значение токена. Тип лексемы, вместе с её значением уже может считаться токеном, который передается на вход парсера.
Для примера, исходный код следующей строки программы
net_worth_future = (assets - liabilities);
может быть преобразован в следующий поток лексических токенов:
ИМЯ "net_worth_future" РАВЕНСТВО ОТКРЫВАЮЩАЯ_СКОБКА ИМЯ "assets" МИНУС ИМЯ "liabilities" ЗАКРЫВАЮЩАЯ_СКОБКА ТОЧКА_С_ЗАПЯТОЙ