Лексер, парсер. Этапы компиляции. (Часть 1)

Содержание

Слайд 2

Фронтэнд Машинно независимые оптимизации Код генерация + машинно зависимые оптимизации Этапы компиляции

Фронтэнд
Машинно независимые оптимизации
Код генерация + машинно зависимые оптимизации

Этапы компиляции

Слайд 3

Лексический анализатор (лексер) Синтаксический анализатор (парсер) Семантический анализатор Генерация промежуточного представления Этапы фронтэнда

Лексический анализатор (лексер)
Синтаксический анализатор (парсер)
Семантический анализатор
Генерация промежуточного представления

Этапы фронтэнда

Слайд 4

Схема работы Исходный код Лексер Парсер Символьная таблица Токен Следующий Семантический анализ


Схема работы

Исходный код

Лексер

Парсер

Символьная таблица

Токен

Следующий

Семантический
анализ

Слайд 5

if (a == b) then a += 5; else a -=

if (a == b) then
a += 5;
else
a -=

5;
if (a == b) then\n\ta += 5;\nelse\n\ta-=5;

Исходный код

Слайд 6

Лексер формирует последовательности входных символов в лексемы, определяет их тип и

Лексер формирует последовательности входных символов в лексемы, определяет их тип и

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

Схема работы

Слайд 7

Лексема -- Токен 12345 (число, 12345) temp_1 (идентификатор, указатель на симтаб)

Лексема -- Токен
12345 (число, 12345)
temp_1 (идентификатор, указатель на симтаб)
+= (оператор, plus_assign)
+ (оператор,

plus)
const (ключевое слово, const)
Void (ключевое слово, void)
var_name (идентификатор, указатель на симтаб)
* (оператор, star)

Примеры лексем и токенов

Слайд 8

Обрабатываемые лексером и парсером последовательности символов и токенов напрямую зависят от

Обрабатываемые лексером и парсером последовательности символов и токенов напрямую зависят от

спецификации языка.
Необходим способ описания
«что в языке может быть»
«что в языке не может быть»

Схема работы

Слайд 9

Алфавит – множество символов, используемых в языке Терминальный символ - символ

Алфавит – множество символов, используемых в языке
Терминальный символ - символ из

алфавита
Нетерминальный символ – символ не из алфавита
Цепочка — последовательность символов
Терминальная цепочка – цепочка, состоящая из терминальных символов
Язык – множество терминальных цепочек
Пример грамматики:
S->aQbZ
Q->ab | cc | Qd
Z -> aQa | c | ε

Строгие определения. Грамматики.

Слайд 10

Тип 0: неограниченные Тип 1: контекстно-зависимые / неукорачивающие Тип 2: контекстно-свободные

Тип 0: неограниченные
Тип 1: контекстно-зависимые / неукорачивающие
Тип 2: контекстно-свободные
Тип 3: регулярные:

праволинейные/леволинейные

Классификация грамматик по Хомскому

Слайд 11

Регулярные грамматики: праволинейные (A → w, A → wB, A,B ∈

Регулярные грамматики:
праволинейные (A → w, A → wB, A,B ∈ N,

w ∈ T*)
леволинейные (A → w, A → Bw, A,B ∈ N, w ∈ T*)
Контекстно-свободные грамматики:
(A → w, A ∈ N, w ∈ (T U N)*)

Строгие определения. Типы грамматик.

Слайд 12

Тип 0 (неограниченные): естественные языки: Русский Английский Тип 2 (контекстно-свободные): большинство

Тип 0 (неограниченные): естественные языки:
Русский
Английский
Тип 2 (контекстно-свободные): большинство языков программирования:
Java
С++
Тип 3:

(регулярные): описание отдельных лексем в языках программирования:
Идентификатор
Числовая константа

Соответствие языков и грамматик

Слайд 13

Тип 2 контекстно – свободная грамматика: может быть описана с помощью

Тип 2 контекстно – свободная грамматика:
может быть описана с помощью конечного

автомата с магазинной памятью
Используется для анализа последовательности токенов синтаксическим анализатором
Тип 3 регулярная грамматика:
Может быть описана с помощью конечного автомата
Используется для формирования лексемы лексическим анализатором

Способы разбора грамматик

Слайд 14

Строгие определения. Регулярные множества.

Строгие определения. Регулярные множества.

Слайд 15

Выражению «(a(b|c))*c» удовлетворяют: с ababacc abacabc Не удовлетворяют: ac abbc abacac Пример регулярного выражения

Выражению «(a(b|c))*c» удовлетворяют:
с
ababacc
abacabc
Не удовлетворяют:
ac
abbc
abacac

Пример регулярного выражения

Слайд 16

Строгие определения. Конечные автоматы.


Строгие определения. Конечные автоматы.

Слайд 17

Схема построения лексера Лексическая спецификация Регулярное выражение Недетерминированный автомат Детерминированный автомат Диаграмма состояний

Схема построения лексера

Лексическая спецификация

Регулярное выражение

Недетерминированный автомат

Детерминированный автомат

Диаграмма состояний

Слайд 18

Регулярное Выражение -> НКА


Регулярное Выражение -> НКА

Слайд 19

Регулярное Выражение -> НКА


Регулярное Выражение -> НКА

Слайд 20

Рассмотрим регулярное выражение: Построим соответствующий НКА: Пример

Рассмотрим регулярное выражение:
Построим соответствующий НКА:

Пример

Слайд 21

ε-замыкание(S) — множество состояний, которые достижимы из S путём переходов по

ε-замыкание(S) — множество состояний, которые достижимы из S путём переходов по

ε
Начальное состояние ДКА - ε-замыкание начального состояния НКА
While(есть нерассмотренное состояние ДКА: «cur»)
Для каждого состояния "B1" НКА, входящего в “cur”:
Для каждого перехода “P” из "B" в “B2":
Добавить состояние “new” ε-замыкание(B2)
Добавить переход “cur” -> “new” по P
Конечные состояния ДКА – состояния, содержащие конечные состояния НКА

НКА -> ДКА

Слайд 22

НКА -> ДКА Пример


НКА -> ДКА Пример

Слайд 23

Пример построенной диаграммы S com1 / IDENTIFIER NUMBER com2 ! +=

Пример построенной диаграммы


S

com1

/

IDENTIFIER

NUMBER

com2

!

+=

temp

!=

++

+

“STRING”

ERROR

Буква

Цифра



Буква, цифра

Цифра

Буква

EOF

EOF

*

*/

/

EOL

/

+

!

=

=

+

“ “

Слайд 24

Неполная лексема Конец файла между /* … */ Конец файла внутри

Неполная лексема
Конец файла между /* … */
Конец файла внутри строки в

кавычках
Буквенный символ в цифровой константе: 123q
Некорректный символ: @

Ошибки находящиеся лексером