Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / "Синтаксического анализатора выражений" из DLL / 8 сообщений из 8, страница 1 из 1
27.10.2003, 19:38
    #32306719
§Oliver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Синтаксического анализатора выражений" из DLL
может есть у кого dll (а можно с source) Синтаксического анализатора выражений, который понимал что-то наподобии: if((X=1),(Y1+Y2)*0,2),(Y1-Y2)), где X,Y1,Y2 - переменные.

PS: Дельный совет тоже непомешает!
...
Рейтинг: 0 / 0
27.10.2003, 20:13
    #32306753
vovan1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Синтаксического анализатора выражений" из DLL
в rfunc.dll есть ф-я CalcExpr(VARCHAR(255),VARCHAR(255))

Пример:
CalcExpr('sin(pi*:p11/3)*:p22','p11=2;p22=4')
...
Рейтинг: 0 / 0
27.10.2003, 20:28
    #32306767
§Oliver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Синтаксического анализатора выражений" из DLL
а вместо 'sin(pi*:p11/3)*:p22' я могу поставить "if (выражение)" ??
...
Рейтинг: 0 / 0
27.10.2003, 20:58
    #32306779
§Oliver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Синтаксического анализатора выражений" из DLL
поставил: но что то с синтаксисим не все понятно:

CalcExpr(S, S) - if(expr, x1, x2) - если expr=0, то x2, иначе x1

вот я и поставил: "CalcExpr('if((:P11>:P2),1,-1)', 'P11=2;P2=10')" - ....ничего

а "CalcExpr('power(:P11,:P2)', 'P11=2;P2=2')" - нормально.

Подскажите - где ошибка!
........
..и еще : при компиляции скрипта у меня выдало ошибку на "IIF" (Yaffil 1.0)
...
Рейтинг: 0 / 0
28.10.2003, 15:35
    #32307667
vovan1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Синтаксического анализатора выражений" из DLL
CalcExpr(S, S)

Пример:
CalcExpr('Sin( Pi*:p11/3)*:P2', 'P11=2;P2=10') f Простенький анализатор выражений.
Поддерживаемые функции и операции
+ - * /
Sin, Cos, tg, ctg, ArсCos, ArcSin, ArcTg, sh, ch, th,
exp, lh, lg, sqrt, sqr, abs(x1)
sgn(x1) - знак числа x1
log(x1,x2) - логарифм x1 по основанию x2
power(x1,x2) - возведение x1 в степень x2
if(expr, x1, x2) - если expr=0, то x2, иначе x1
Min(x1, ...) - минимум из чисел
Max(x1, ...) - максимум из чисел
Sum(x1, ...) - суммирование аргументов
Avg(x1, ...) - среднее арифметическое
Pi - число Pi.

Для использования переменных в выражении - перед ними ставится двоеточие, и они описываются во втором параметре (см. пример).

ExprIsValid(S, S) i Проверка на корректность заданного выражения. Возвращает 0, если все правильно, иначе - код ошибки.
...
Рейтинг: 0 / 0
28.10.2003, 15:39
    #32307677
vovan1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Синтаксического анализатора выражений" из DLL
кстати если тебе надо для работы в IB просто скопируй в папку UDF, только переименуй в какое нибудь другое имя. Затем выполни скрипт

DECLARE EXTERNAL FUNCTION CALCEXPR
CSTRING(16384),
CSTRING(16384)
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT 'fn_CalcExpr' MODULE_NAME 'rfunc';

DECLARE EXTERNAL FUNCTION EXPRISVALID
CSTRING(16384),
CSTRING(16384)
RETURNS INTEGER BY VALUE
ENTRY_POINT 'fn_ExprIsValid' MODULE_NAME 'rfunc';

где 'rfunc' переименнованная дллка
...
Рейтинг: 0 / 0
28.10.2003, 16:54
    #32307820
§Oliver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Синтаксического анализатора выражений" из DLL
да я все прекрасно понимаю... и UDF я подключил и
автор писал:CalcExpr('Sin( Pi*:p11/3)*:P2', 'P11=2;P2=10') у меня работает и автор писал:CalcExpr('power(:P11,:P2)', 'P11=2;P2=2') работает,
а вот такую операция - автор писал:if(expr, x1, x2) - если expr=0, то x2, иначе x1
я реализовать немогу...Вот и прошу помощи!
...
Рейтинг: 0 / 0
29.10.2003, 19:49
    #32309609
vovan1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Синтаксического анализатора выражений" из DLL
Если тебе надо именно такая конструкция то воспользуйся ф-ми

IIF(i,i1,i2) i1 если i<>0
DIF(f,f1,f2)
i-integer
f-float

из rfunc.dll


DECLARE EXTERNAL FUNCTION IIF
INTEGER, INTEGER, INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT 'fn_iif' MODULE_NAME 'rfunc';

DECLARE EXTERNAL FUNCTION DIF
INTEGER, DOUBLE PRECISION, DOUBLE PRECISION
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT 'fn_dif' MODULE_NAME 'rfunc';

DECLARE EXTERNAL FUNCTION CIF
INTEGER, CSTRING(256), CSTRING(256)
RETURNS CSTRING(256)
ENTRY_POINT 'fn_cif' MODULE_NAME 'rfunc';
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / "Синтаксического анализатора выражений" из DLL / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]