Шаблон проектирования Интерпретатор (Interpreter)

Рассмотрим шестой в серии шаблон — интерпретатор.

Суть — получая формальный язык, определяет представление его грамматики и интерпретатор, использующий это представление для обработки выражения языка.

Согласен, не особо понятно из определения, поэтому скажем простыми словами — шаблон, для интерпретирования некоторого формального скажем языка.

Опять же не особо понятно, давайте перейдем от слов к коду и все станет ясней.

Напишем маленькое упрощенное приложение, где пользователь будет вводить нечто типа 5 + 8, а на выходе будем иметь математическую интерпретацию и посчитаем результат (суть в том, что это выражение является одной строкой, мы его будем разделять на числа и операторы и посчитаем математически какого будет значение).

Для начала нам нужен некий интерфейс выражения.

Так как у нас упрощенный вариант, будем возвращать целочисленное значение.

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

Здесь мы получаем на вход некую строку и пытаемся ее преобразовать в число (будем считать предварительно, что на вход нам обязательно придет число).

Далее создадим 2 простых оператора — прибавление и вычитание.

Для того, чтобы прибавить, нужно 2 (числовых) выражения, поэтому при создании передаем их в конструкторе, а сам метод интерпретации будет максимально прост, интерпретируем числовые выражения в числа и складываем их.

Аналогично для вычитания.

Точно так же можно было создать еще и умножение и деление, но так как у них порядок вычисления выше, это усложнит наш пример, оставляю вам.

Теперь напишем маленький утилитный класс для определения операторов.

Первый метод проверяет, что на вход пришло не число, а оператор, а второй метод определяет какой именно это оператор (в дальнейшем если будут еще операторы, то их придется просто добавить в этот класс.

Итак, для того, чтобы протестировать все это, нам нужна разметка главного экрана, создадим на ней поле ввода, кнопку интерпретации и текстовку вывода.

И наконец рассмотрим конечный код.

По нажатию на кнопку интерпретации происходит следующее — получаем текст из поля ввода, интерпретируем и отображаем в текстовке.

Посмотрим детальней сам метод интерпретации.

Будем предполагать, что все наши выражения (числа и операторы) разделены пробелом, потому и преобразуем текст ввода в массив строк. Под него создадим такой же массив для выражений. Проходим циклом по всем элементам и если мы наткнулись на число (не оператор), то сохраняем его в виде числового выражения (nwe Number(items[i]). После чего проходим еще раз циклом и находим все операторы, после чего в результат сохраняем то, что было интерпретировано оператором.

Глянем скиншоты и прольем ясности.

Итак, вводим 5 + 3 и жмем на кнопку, в коде будет следующее — сначала находятся числа 5 и 3 и записываются в ячейки массива, после чего повторным циклом находится оператор «+» и высчитывается сумма располагающихся слева и справа от индекса выражений.

По сути своей шаблоном интерпреатотор является некоторый маленький язык, который получает информацию на вход и переводит ее в другой язык, т.е. интерпретирует по-своему. Для того, чтобы написать хороший интерпретатор понадобится довольно много времени. Один из примеров интерпретатора — Siri, которая преобразует звуковые волны в слова.

Плюсы шаблона — отдельные выражения, которые можно независимо друг от друга изменять.

Минусы — сложность написания действительно хорошего интерпретатора.

Запись опубликована в рубрике Программирование Android, Программирование Java. Добавьте в закладки постоянную ссылку.