Лексер. Парсер. (Часть 2) презентация

Содержание

Слайд 2

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

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

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

Слайд 3

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

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

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

Слайд 4


Схема работы

Исходный код

Лексер

Парсер

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

Токен

Следующий

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

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

Слайд 5

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

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

Схема работы

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

Слайд 6

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

способ описания
«что в языке может быть»
«что в языке не может быть»

Схема работы

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

Слайд 7

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

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

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

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

Слайд 8

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

Классификация грамматик

по Хомскому

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

Слайд 9

Регулярные грамматики:
праволинейные (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)*)

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

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

Слайд 10

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

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

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

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

Слайд 11

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

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

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

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

Слайд 12

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

Строгие определения. Конечные автоматы с магазинной памятью.

Недетерминированный Детерминированный Строгие определения. Конечные автоматы с магазинной памятью.

Слайд 13

Нисходящий анализ
Метод рекурсивного спуска (парсер с возвратом)
Предиктивный анализатор (предсказывающий анализатор) (LL анализатор)
Восходящий анализ

(LR анализатор)

Варианты синтаксического анализа

Нисходящий анализ Метод рекурсивного спуска (парсер с возвратом) Предиктивный анализатор (предсказывающий анализатор) (LL

Слайд 14

id + id * id

Дерево разбора

id + id * id Дерево разбора

Слайд 15

Дерево разбора строится сверху вниз, слева направо
Токены от лексера рассматриваются в порядке поступления

Метод

рекурсивного спуска

Дерево разбора строится сверху вниз, слева направо Токены от лексера рассматриваются в порядке

Слайд 16

Каждому нетерминалу соответствует процедура, в которую жёстко зашиты продукции данного нетерминала
Процедура последовательно сравнивает

пришедшие токены с терминалами продукций
Если ни одна продукция не подходит – ошибка
Если встречается нетерминал управление переходит в процедуру нетерминала

Метод рекурсивного спуска

Каждому нетерминалу соответствует процедура, в которую жёстко зашиты продукции данного нетерминала Процедура последовательно

Слайд 17


Пример применения метода рекурсивного спуска

Пример применения метода рекурсивного спуска

Слайд 18

Грамматика жёстко зашита в алгоритм. В последующих алгоритмах на основании грамматики строятся таблицы
Алгоритм

выполняется за экспоненциальное время
Алгоритм может зацикливаться
Использование неявного стека

Рекурсивный спуск, минусы

Грамматика жёстко зашита в алгоритм. В последующих алгоритмах на основании грамматики строятся таблицы

Слайд 19

Идея – убрать откатывание. По каждому символу должно быть изначально ясно куда переходим.
Преобразование

грамматики
Удаление левой рекурсии
Левая факторизация
Вычисление множеств
FIRST
FOLLOW
Составление таблицы

Предиктивный анализатор

Идея – убрать откатывание. По каждому символу должно быть изначально ясно куда переходим.

Слайд 20

Удаление левой рекурсии
Левая факторизация

Предиктивный анализатор

Удаление левой рекурсии Левая факторизация Предиктивный анализатор

Слайд 21

Пример преобразования
грамматики:

Предиктивный анализатор

Пример преобразования грамматики: Предиктивный анализатор

Слайд 22

Определение множества FIRST
FIRST(a), a∈(N⋃T)* - множество терминалов или ℇ, с которых может начинаться

а.
Построение множества FIRST

Предиктивный анализатор

Определение множества FIRST FIRST(a), a∈(N⋃T)* - множество терминалов или ℇ, с которых может

Слайд 23

Определение множества FOLLOW
FOLLOW(A), A∈N – множества терминалов, которые могут появиться сразу за А,

включая концевой маркер $
Построение множества FOLLOW

Предиктивный анализатор

Определение множества FOLLOW FOLLOW(A), A∈N – множества терминалов, которые могут появиться сразу за

Слайд 24

Пример построения FIRST, FOLLOW

Предиктивный анализ

Пример построения FIRST, FOLLOW Предиктивный анализ

Слайд 25

Построение таблицы

Предиктивный анализ

Построение таблицы Предиктивный анализ

Слайд 26

Пример построения таблицы

Предиктивный анализ

Пример построения таблицы Предиктивный анализ

Слайд 27


Предиктивный анализ, разбор

Предиктивный анализ, разбор

Слайд 28


Предиктивный анализ, пример

Предиктивный анализ, пример

Слайд 29

Строим дерево разбора начиная с листьев
Для большинства языков программирования можно построить LR грамматику
Наиболее

общий метод анализа без отката
Существуют генераторы LR анализаторов

Восходящий анализатор

Строим дерево разбора начиная с листьев Для большинства языков программирования можно построить LR

Слайд 30

Построение LR(1) анализатора

1. Пополнение грамматики
2. Построение канонической системы множеств допустимых LR(1)-ситуаций
3. Построение таблицы

анализатора
3.1 Построение таблицы Goto
3.2 Построение таблицы Actions
4. Разбор цепочки

Построение LR(1) анализатора 1. Пополнение грамматики 2. Построение канонической системы множеств допустимых LR(1)-ситуаций

Слайд 31

Пополнение грамматики

Добавим новое правило S' → S, и сделаем S' аксиомой грамматики.
Допуск имеет

место ⬄ когда возможно осуществить свёртку по правилу S → S'.

Пополнение грамматики Добавим новое правило S' → S, и сделаем S' аксиомой грамматики.

Слайд 32

Каноническая система множеств

Вначале имеется множество I0 с конфигурацией анализатора S' → .S, $
К этой

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

Каноническая система множеств Вначале имеется множество I0 с конфигурацией анализатора S' → .S,

Слайд 33


Пример

Пример

Слайд 34

Построение Goto

Eсли в канонической системе множеств есть переход из Ii в Ij по символу A, то в

Goto(Ii, A) мы ставим состояние Ij. После заполнения таблицы полагаем, что во всех пустых ячейках Goto(Ii, A) = Error
После заполнения таблицы полагаем, что во всех пустых ячейках Goto(Ii, A) = Error

Построение Goto Eсли в канонической системе множеств есть переход из Ii в Ij

Слайд 35

Построение action

Если есть переход по терминалу a из состояния Ii в состояние Ij, то

Action(Ii, a) = Shift(Ij)
Если A ≠ S' и есть конфигруация A → α., a, то Action(Ii, a) = Reduce(A → α)
Для состояния Ii, в котором есть конфигурация S' → S., $, Action(Ii, $) = Accept
Для всех пустых ячеек Action(Ii, a) = Error

Построение action Если есть переход по терминалу a из состояния Ii в состояние

Слайд 36


Пример

Пример

Слайд 37


Восходящий анализ, разбор

Восходящий анализ, разбор

Слайд 38


Восходящий анализ, пример

Восходящий анализ, пример

Слайд 39

Баланс скобок {…{…(…)…(((…))…)…}…(…}…}
Верность выражений “+” между expr

Обрабатываемые ошибки

Баланс скобок {…{…(…)…(((…))…)…}…(…}…} Верность выражений “+” между expr Обрабатываемые ошибки

Имя файла: Лексер.-Парсер.-(Часть-2).pptx
Количество просмотров: 77
Количество скачиваний: 0