LexBody
f
Для парсинга тела функции используется алгоритм сортировочной станции.
Входная строка анализируется посимвольно и могут встречаться следующие символы: число, буква (после этого определяется, является ли это известной переменной, функцией или же неизвестная лексема), открывающие и закрывающие скобки, запятая в качестве разделителя аргументов функций, а также операторы сложения, вычитания, умножения, деления и возведения в степень (+, -, *, /, ^ соответственно). Все остальные символы являются ошибочными. Когда находится известная лексема, с ней сопоставляется токен:
Токен | Группа токенов | Описание |
IToken | Общий интерфейс для всех токенов | |
Number | IToken | Числовой токен |
PI | IToken | Число Пи |
Euler | IToken | Число Эйлера |
Variable | IToken | Токен переменной |
Bracket | IToken | Токен открывающей скобки |
Operator | Интерфейс для всех операторов | |
Function | Интерфейс для всех функций | |
ExtremumFunction | Интерфейс для функций min, max | |
UnaryPlus | Operator | Токен унарного плюса |
UnaryMinus | Operator | Токен унарного минуса |
BinaryPlus | Operator | Токен бинарного плюса |
BinaryMinus | Operator | Токен бинарного минуса |
ОperatorMul | Operator | Токен оператора умножения |
ОperatorDiv | Operator | Токен оператора деления |
ОperatorPow | Operator | Токен оператора возведения в степень |
SinFunction | Function | Токен синуса |
CosFunction | Function | Токен косинуса |
TgFunction | Function | Токен тангенса |
Log10Function | Function | Токен логарифма с десятичным основанием |
LnFunction | Function | Токен натурального логарифма |
LogFunction | Function | Токен логарифма с произвольным основанием |
J0Function | Function | Токен функции Бесселя 1 рода с основанием 0 |
J1Function | Function | Токен функции Бесселя 1 рода с основанием 1 |
JnFunction | Function | Токен функции Бесселя 1 рода с произвольным основанием |
Y0Function | Function | Токен функции Бесселя 2 рода с основанием 0 |
Y1Function | Function | Токен функции Бесселя 2 рода с основанием 1 |
YnFunction | Function | Токен функции Бесселя 2 рода с произвольным основанием |
AbsFunction | Function | Токен функции модуля |
GammaFunction | Function | Токен гамма функции |
ArgFunction | Function | Токен функции фазового угла |
MinFunction | ExtremumFunction | Токен функции поиска минимального значения |
MaxFunction | ExtremumFunction | Токен функции поиска максимального значения |
Модифицированный алгоритм сортировочной станции
Модифицированный алгоритм сортировочной станции:
Алгоритм был модифицирован для функций поиска минимума и максимума. Данные функции могут принимать неограниченное количество аргументов, т.е. заранее число неизвестно. Поэтому при обнаружении токена из группы Function он будет помещен в стек функций funcStack. Затем идет подсчет запятых (если такие имеются). При правильном синтаксисе количество параметров больше количества запятых на 1. Подсчет параметров заканчивается, когда встречается закрывающая скобка. Если эта скобка закрывает функции min или max, то в токен записывается ожидаемое число аргументов.
Отдельно необходимо выделить работу с комплексными числами. Поскольку CUDA не содержит собственного типа для комплексных чисел, был использован тип из библиотеки thrust – thrust::complex<T>. Некоторые функции не определены для комплексных чисел, например, функции max, min. Для создания заглушек были определены спецификации классов - class ExtremumFunction<thrust::complex<T>, Implementation, TokenBinPredicate> для функций экстремума (поиск минимума и максимума), а также class PolarFunction <double> : public Function<double>, т.к. функция должна возвращать комплексное число, а математическое выражение Mathexpr<double> не сможет обработать его.