Достоин внимания только модуль countypecore. В нем описан алгоритм, вычисляющий вводимые выражения.
Входной точкой явялется вот эта функция.
Тесты алгоритма находятся здесь.
Шаги алгоритма:
- Стандартизация. Фраза приводится к стандартному виду. Например, все слова вида
процент-
заменяются на символ%
. - Поиск функции и шаблона. По приведенной к стандартному виду фразе находим функцию, шаблонам которой соответствует фраза. Также находим шаблон, которому соответствует фраза.
- Очищение выражения. Извлекаем из фразы только ту ее часть, которая соответствует шаблону. Используя шаблон можно извлечь из фразы только ту ее часть, которая соответствует шаблону. Например, из фразы
я прошел 8450 метров в километрах
будет извлечено8450 метров в километрах
. То, что окружает вычисляемое выражение никак не влияет на ответ, поэтому можно от этого избавиться. - Извлечение строчных представлений аргументов функций (лексемы). Используя шаблон и модифицированную фразу извлекаем из фразы аргументы, которые нужно передать соответствующей функции, и упорядочиваем их. Каждый шаблон помимо самого паттерна содержит то, в каком порядке представлены аргументы в фразах, которые ему соответствуют. Таким образом шаблону
__number __unit в __unit
соответствует порядок аргументов(1, 2, 3)
, то есть прямой и после извлечения аргументов не нужно менять их порядок. Шаблонусколько __unit в __number __unit
соответствует порядок аргументов(3, 1, 2)
. - Определение типов аргументов. Используя полученные строчные представления аргументов найдем соответствующие им объекты, в которых содержится полная информация об аргументе.
- Передача аргументов в функцию.
- Возврат ответа.
Модуль app был написан во времена, когда автор не знал о существовании фреймворка Moxy для реализации паттерна MVP и немного принебрегал чистотой кода.