LexBody

Материал из CAMaaS preliminary wiki
Версия от 13:40, 21 апреля 2019; Alinap95 (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

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 Токен функции поиска максимального значения

Модифицированный алгоритм сортировочной станции

Модифицированный алгоритм сортировочной станции:

LexBody.jpg

Алгоритм был модифицирован для функций поиска минимума и максимума. Данные функции могут принимать неограниченное количество аргументов, т.е. заранее число неизвестно. Поэтому при обнаружении токена из группы Function он будет помещен в стек функций funcStack. Затем идет подсчет запятых (если такие имеются). При правильном синтаксисе количество параметров больше количества запятых на 1. Подсчет параметров заканчивается, когда встречается закрывающая скобка. Если эта скобка закрывает функции min или max, то в токен записывается ожидаемое число аргументов.

Отдельно необходимо выделить работу с комплексными числами. Поскольку CUDA не содержит собственного типа для комплексных чисел, был использован тип из библиотеки thrustthrust::complex<T>. Некоторые функции не определены для комплексных чисел, например, функции max, min. Для создания заглушек были определены спецификации классов - class ExtremumFunction<thrust::complex<T>, Implementation, TokenBinPredicate> для функций экстремума (поиск минимума и максимума), а также class PolarFunction <double> : public Function<double>, т.к. функция должна возвращать комплексное число, а математическое выражение Mathexpr<double> не сможет обработать его.