2013-08-14 1 views
1

В Delphi XE У меня есть рутина, которая разрушает некоторые сложные формулы для бинарного результата формулы, как это:Как я могу оценить строку, содержащую двоичную формулу в Delphi?

(1 & ((1 | 0) | 1) & 1)

Поскольку мое приложение на SQL Server я могу легко сделать SELECT (1 & ((1 | 0) | 1) & 1) Поскольку Result и SQL Server будут оценивать логику, чтобы дать мне результат 1 или 0.

Я не могу найти родной метод Delphi для представления строкового представления бинарной формулы и оценки его.

Я заглянул в Live Bindings. Оценщики добавили в XE, но любая попытка оператора и/или запускает ошибки парсера, поэтому я считаю, что это скорее математический процесс.

Я также посмотрел на несколько парсеров, но никто, действительно, не выпрыгнул на меня.

Так как я могу сделать что-то подобное:

iSomeInt: = Evaluate ('(1 & ((1 | 0) | 1) & 1)');

BTW .. Я могу полностью переработать формулу и использовать ее и/или вместо & | .. Это было просто для того, чтобы она работала с SQL Server.

+0

Посмотрите здесь: http://blogs.embarcadero.com/ao/2012/04/13/39249 –

+0

JCL TEvaluator выглядит хорошо. см. этот предыдущий вопрос SO http://stackoverflow.com/questions/13592136/which-functions-are-predefined-in-jcl-tevaluator-class – Sam

+0

Эксперт по оценке JCL действительно хорош. Хотя он плохо обрабатывает десятичные разделители и не имеет оператора мощности. Обе эти упущения я исправил в своей собственной ветке, но могу ли я убедить любого из разработчиков JEDI сделать это? Могу я черт! Разочарование, когда проекты с открытым исходным кодом умирают. И нет очевидного способа вернуть его к жизни. –

ответ

1

Проблема не в том, что это «математический процесс», так как синтаксический анализатор LiveBindings ожидает, что ваш математический процесс будет выражен операторами Pascal, но & и | являются операторами С.

Попробуйте что-то вроде этого, если у вас есть функция под названием LiveBindingsEval, который оценивает строку с анализатором LiveBindings:

function PreprocessExpression(const expr: string): string; 
begin 
    result := StringReplace(expr, '|', ' or ', [rfReplaceAll]); 
    result := StringReplace(result, '&', ' and ', [rfReplaceAll]); 
end; 

iSomeInt := LiveBindingsEval(PreprocessExpression('(1&((1|0)|1)&1)')); 

Вам может понадобиться, чтобы улучшить это немного, но это должно быть достаточно, чтобы вы началось по правильному пути ...

+0

Мейсон ... Я действительно использовал Delphi и/или с Оценщиком, и он вообще не заботился о операторах. Это было не совсем очевидно, но я упомянул, что использовал только & & для совместимости с SQL Server. Я вернусь и сделаю еще один снимок. –

 Смежные вопросы

  • Нет связанных вопросов^_^