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

Процесс компиляции состоит из следующих этапов:

1. Лексический анализ. На этом этапе последовательность символов исходного файла преобразуется в последовательность лексем.

2. Синтаксический (грамматический) анализ. Последовательность лексем преобразуется в дерево разбора.

3. Семантический анализ. Дерево разбора обрабатывается с целью установления его семантики (смысла) — например, привязка идентификаторов к их декларациям, типам, проверка совместимости, определение типов выражений и т. д. Результат обычно называется «промежуточным представлением/кодом», и может быть дополненным деревом разбора, новым деревом, абстрактным набором команд или чем-то ещё, удобным для дальнейшей обработки.

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

5. Генерация кода. Из промежуточного представления порождается код на целевом языке.

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

Ниже приведен пример фрагмента кода лексического анализатора. Левая часть кода представляет собой регулярные выражения для искомых лексем (if, переменная, число, унарная или бинарная операция), а правая - выполняемый код анализатора в случае их нахождения.

%%

if printf ("IF statement\n");

[a-z]+ printf ("tag, value %s\n", yytext);

{D}+ printf ("decimal number %s\n", yytext);

"++" printf ("unary op\n");

"+" printf ("binary op\n");


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: