Анализатор логических и математических выражений - PullRequest
9 голосов
/ 18 февраля 2010

Я пишу приложение, которое позволяет пользователю вводить логическое выражение. Мне нужна возможность оценивать введенное логическое выражение во время выполнения, и я ищу как парсер, так и валидатор expressoin.

Parser
Парсер должен принять логическое выражение в виде строки и вернуть true / false.

Пример:

string expression = "(1 == 1) && (1 > 0)";
Parser parser = new Parser();
boolean result = parser.parse(expression);  // Result should be True.

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

expression = "((1 + 1 * 2) == 1)";
result = parser.parse(expression);  // Result should be False.

Validate
Чтобы я мог сообщить пользователю, если есть проблема с вводимым выражением, мне также нужен способ проверки синтаксиса.

Я работаю в C # с использованием .NET Compact Framework, но если вам известно что-то написанное на другом языке, это может быть полезно.

Спасибо за любую помощь, которую вы можете предоставить. Том

Ответы [ 7 ]

6 голосов
/ 23 февраля 2010

Наш проект использует NCalc ANTLR снизу для лексирования / разбора), и мы очень довольны.

NCalc - это математическое выражение оценщик в .NET. NCalc может разобрать любой выражение и оценка результата, включая статические или динамические параметры и пользовательские функции.

Наше приложение требует кросс-компиляции как для Full, так и для Compact Frameworks. С помощью относительно простых настроек мы смогли заставить и NCalc, и ANTLR работать для обоих типов фреймворков.

3 голосов
/ 18 февраля 2010

http://www.antlr.org

Грамматики Antlr могут быть разработаны для анализа и оценки.

Вот пример: http://www.antlr.org/wiki/display/ANTLR3/Expression+evaluator

2 голосов
/ 19 февраля 2010

Предполагая, что вы можете немного изменить свой синтаксис, пусть встроенная база данных выполнит работу за вас с помощью запроса, подобного T-SQL:

select case when <Expression> then 1 else 0 end as Result

Используя ваш пример:

select case when ((1 = 1) and (1 > 0)) then 1 else 0 end as Result
select case when ((1 + 1 * 2) = 1) then 1 else 0 end as Result
0 голосов
/ 19 февраля 2010

Этот тип вещей - хлеб с маслом F #.Вы можете попробовать.Для синтаксического анализа используйте рекурсивный спуск, затем вы можете запустить дерево, которое в результате.Если у вас есть контроль над языком ввода, вы можете обойтись операцией с кавычками.

0 голосов
/ 18 февраля 2010

Вот отличный анализатор оценки для Codeproject , который использует метод eval и не использует CodeDOM или что-то подобное. Вот отличная статья о создании оценщика выражений с использованием Antlr, также на том же сайте.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 18 февраля 2010

Для этого вы можете использовать библиотеку dotMath .

0 голосов
/ 18 февраля 2010

Я не знаю ни одной библиотеки, чтобы сделать это проще, но у вас действительно есть две подзадачи. Вам нужно создать конвертер из инфикса в постфикс, а затем написать базовый калькулятор для логических и математических операций.

Как только вы построите логическое дерево / стек, начните выполнять операции. Если у вас есть что-то, кроме числа, оцените его, отправив строку / выражение в арифметический калькулятор, который выполняет преобразование infix-> postfix, а затем возвращает значение.

Если вы используете Google "Infix to Postfix" и "Стек калькулятор RPN", вы, вероятно, можете найти больше ресурсов.

...