Паттерны проектирования «Разработка компиляторов» Бреслав А. А. Содержание  Лексический анализ   Синтаксический анализ   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
Задача: кардинальное изменение
поведения объекта при изменение
состояние
 Решение: создать класс состояния и
делегировать объекту этого класса
варьируемое поведение. При
изменении состояния подменяется
объект состояния.

Бреслав А. А.
Паттерны проектирования. Введение