Паттерны проектирования «Разработка компиляторов» Бреслав А. А. Содержание Лексический анализ Синтаксический анализ Visitor Исполнение State Facade Interpreter Семантический анализ Builder Bridge Chain of Responsibility Бреслав А.
Download
Report
Transcript Паттерны проектирования «Разработка компиляторов» Бреслав А. А. Содержание Лексический анализ Синтаксический анализ Visitor Исполнение State Facade Interpreter Семантический анализ Builder Bridge Chain of Responsibility Бреслав А.
Паттерны
проектирования
«Разработка компиляторов»
Бреслав А. А.
Содержание
Лексический анализ
Синтаксический анализ
Visitor
Исполнение
State
Facade
Interpreter
Семантический анализ
Builder
Bridge
Chain of Responsibility
Бреслав А. А.
Паттерны проектирования. Введение
Задача
Во входном потоке задано
арифметическое выражение
целые
числа
операции +, -, *, /
круглые скобки
Вычислить значение выражения
Бреслав А. А.
Паттерны проектирования. Введение
Этапы вычисления
Лексический анализ
Синтаксический анализ
Семантический анализ
Трансляция / Исполнение
Бреслав А. А.
Паттерны проектирования. Введение
Лексический анализ
Разделение входных данных на
лексемы (токены)
Преобразование набора символов в
набор значимый элементов
«(12 + 3) * 5» -> [(] [12] [+] [3] [)] [*] [5]
LEFT
INT(12) PLUS INT(3) RIGHT TIMES INT(5)
набор
Бреслав А. А.
символов -> набор токенов
Паттерны проектирования. Введение
Синтаксический анализ
Распознавание синтаксических
конструкций в наборе лексем
(12 + 3) * 5
3), 5) – функциональная запись
12 3 + 5 * – обратная польская запись
Дерево выражения
*(+(12,
Бреслав А. А.
Паттерны проектирования. Введение
Семантический анализ
Связывание имен с осмысленными
объектами
*(+(12, 3), 5)
Произведение
суммы 12 и 3 на 5
Имена «*» и «+» преобразованы в функции
«произведение» и «сумма»
Бреслав А. А.
Паттерны проектирования. Введение
Трансляция (компилятор)
Преобразование в исполнимый вид
Произведение суммы 12 и 3 на 5
+ 3) * 5 – Java
Возможна трансляция в
(12
текст на языке программирования
байт-код
машинный код
…
Бреслав А. А.
Паттерны проектирования. Введение
Исполнение (интерпретатор)
Выполнение вычислений
Произведение суммы 12 и 3 на 5
75
Значение
Бреслав А. А.
выражения вычислено
Паттерны проектирования. Введение
Часть I
Лексический анализ
Бреслав А. А.
Лексический анализ
Разделение входных данных на
лексемы (токены)
Преобразование набора символов в
набор значимый элементов
«(12 + 3) * 5» -> [(] [12] [+] [3] [)] [*] [5]
LEFT
INT(12) PLUS INT(3) RIGHT TIMES INT(5)
набор
Бреслав А. А.
символов -> набор токенов
Паттерны проектирования. Введение
Преобразование
Дан поток символов
Получить список токенов
Определить
границы токенов
Определить типы токенов
Для формализации используется идея
конечного автомата
Бреслав А. А.
Паттерны проектирования. Введение
Конечный автомат
[operation or brace]
Начальное
Конечное
[EOF]
Start
End
[else]
[digit]
[any]
[non digit]
Error
Number
[any]
[digit]
Бреслав А. А.
Состояние
Паттерны проектирования. Введение
Переход
(условие на
символ)
Принцип работы автомата
Начинаем в состоянии Start
Получаем входной символ
переходим
в состояние, к которое ведет
соответствующее ребро
Если текущее состояние – End или
Error, заканчиваем.
Бреслав А. А.
Паттерны проектирования. Введение
Действия на переходах
[operation or brace] / createToken()
[EOF]
Start
End
[else]
[any]
[digit]
[non digit] / createToken()
Error
Number
[any]
[digit] / next()
Бреслав А. А.
Паттерны проектирования. Введение
Реализация автомата
Чтение из потока
Переход в зависимости от состояния
Действия
на переходе
Простое решение – switch по
состояниям
внутри
Бреслав А. А.
switch по типу символа
Паттерны проектирования. Введение
Простая реализация автомата
switch (state) {
case START:
switch (c) {
// …
case NUMBER:
if (!Character.isDigit(c)) {
state = ERROR;
// …
default:
state = ERROR;
break;
}
Бреслав А. А.
Паттерны проектирования. Введение
Минусы простой реализации
Неудобная структура
двухуровневый
switch – громоздкий
код плохо читается из-за break
Трудно расширять
Добавление
состояния требует внесения
изменений в большой и сложный switch
Бреслав А. А.
Паттерны проектирования. Введение
Как сделать лучше
Применить рефакторинг
замена
условной логики полиморфизмом
использовать паттерн State – состояние
Состояния автомата – это enum
сделаем
реакцию на входной символ
методом состояния
Бреслав А. А.
Паттерны проектирования. Введение
Перечисление для состояний
enum State {
START,
NUMBER,
END,
ERROR;
public abstract
State performAction(int c, Tokenizer tokenizer);
}
Бреслав А. А.
Паттерны проектирования. Введение
Реализация реакции на символ
NUMBER {
private int data;
public State performAction(int c,
Tokenizer tokenizer) {
if (!Character.isDigit(c)) {
tokenizer.addToken(
NumberToken.getToken(data));
data = 0;
return START;
}
data = data * 10 + (c - '0');
tokenizer.next();
return NUMBER;
}
}
Бреслав А. А.
Паттерны проектирования. Введение
Реализация автомата
State state = State.START;
next();
while (state != State.END && state != State.ERROR) {
state = state.performAction(cur, this);
}
if (state == State.ERROR) {
throw new IllegalArgumentException((char) cur + "");
}
Бреслав А. А.
Паттерны проектирования. Введение
Паттерн State
Задача: кардинальное изменение
поведения объекта при изменение
состояние
Решение: создать класс состояния и
делегировать объекту этого класса
варьируемое поведение. При
изменении состояния подменяется
объект состояния.
Бреслав А. А.
Паттерны проектирования. Введение