Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Парсинг математических выражений  [new]
cpp
Guest
Привет!

Подскажите алгоритм разбора математического выражения вида:

- '10101' - 2 * '5689' + '4567' * '98721' > 0


Результатом должно быть значение BOOL (1 = true, 0 = false). Для упрощения скобки в выражении НЕ используются. В одинарных ковычках метки, по которым значение может быть получено запросом из базы.

Спасибо!
13 фев 03, 09:49    [127917]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг математических выражений  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
разбор выражений - достаточно нетривиальная задача и парой слов тут не обойтись
С другой стороные глупо делать свой разбор, когда это может сделать сам сервер. Я написал такую процедуру, которой и пользуюсь для таких случаев:
create procedure s_calc_str   -- считает выражение


@str varchar(300), -- само выражение

@m dec(21,8) out, -- сколько получилось

@show int=0 -- если 1 - вывести селектом

AS
BEGIN
declare @s nvarchar(400)

select @s='set @m=('+@str+')'
exec sp_executesql @s, N'@m dec(21,8) out', @m out
if @show=1 select @m 'val'
END
13 фев 03, 10:08    [127939]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг математических выражений  [new]
rmn_itam
Member

Откуда: Новосибирск
Сообщений: 86
Так что надо - проверить правильность написания формулы?
13 фев 03, 10:08    [127942]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг математических выражений  [new]
cpp
Guest
Так что надо - проверить правильность написания формулы?

Правильно! Но только в ковычках не цифры, а метки по которым делается запрос и только потом подставляется число.
13 фев 03, 10:36    [127988]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг математических выражений  [new]
cpp
Guest
А что делает процедура sp_executesql?
13 фев 03, 10:39    [127993]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг математических выражений  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
А что делает процедура sp_executesql?
разбора математического выражения
:)
13 фев 03, 10:57    [128035]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг математических выражений  [new]
NNN
Guest
2cpp

> А что делает процедура sp_executesql?

А в BOL разве об этом не написано?
13 фев 03, 11:00    [128043]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг математических выражений  [new]
rmn_itam
Member

Откуда: Новосибирск
Сообщений: 86
Если надо проверить лишь правильность формулы - то можно создать временную таблицу с числом столбцов, как в формуле, заполнить например единицамим и затем сделать селект с выполнением расчета по твоей формуле. Если ругается- значит формула неверна. Если возвращает число- можно проводить расчеты.
13 фев 03, 11:39    [128131]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг математических выражений  [new]
schoooltz
Member

Откуда:
Сообщений: 7
to rmn_itam
>Если надо проверить лишь правильность формулы - то можно создать >временную таблицу с числом столбцов, как в формуле, заполнить например >единицамим и затем сделать селект с выполнением расчета по твоей >формуле. Если ругается- значит формула неверна. Если возвращает число- >можно проводить расчеты.


Да Вы батенька маньяк! За такие запросы к серверу лучше вообще не подпускать!
13 фев 03, 12:23    [128205]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг математических выражений  [new]
cpp
Guest
Вообщем отвечаю сам себе.

Лучше вместо ковычек использовать {10101}. Тогда:
1.Составляем список всех вхождений шаблона {%}
2.Рассчитываем (запросом) все значения заключенные в {}.
3.Заменяем по тексту {...} на числовые значения.
4.Используем sp_executesql для расчета.
13 фев 03, 12:30    [128219]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг математических выражений  [new]
rmn_itam
Member

Откуда: Новосибирск
Сообщений: 86
to schoooltz

Маньяк - это тот кто будет писать сам ручками писать свою проверку произвольной математической формулы. Если вид формулы жестко задан - то нет проблем. А в общем случае время затраченое на написание и ловлю блох будет такое, что лучше повесится.
13 фев 03, 13:25    [128312]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг математических выражений  [new]
culis
Member

Откуда: Calgary, Alta
Сообщений: 263
Чтобы я сделал - так это написал бы ком который оборачивает MSScriptcontrol - там уже все что тебе надо есть. Ну и просто дергал бы его из хранимы. Он распарсивает любые мат выражения.
13 фев 03, 22:33    [128904]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить