Синтаксический анализатор булева и математического выражения

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

Синтаксический анализатор
Синтаксический анализатор должен взять булево выражение в качестве строки и возвратить true.

Пример:

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

В дополнение к обработке булевых выражений мне также нужен он для обработки Математики.

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

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

Я работаю в C# с помощью.NET Компактная Платформа, но если Вы знаете о чем-то записанном на другом языке, который может быть полезным.

Спасибо за любую справку можно обеспечить. Tom

9
задан skaffman 18 February 2010 в 20:34
поделиться

7 ответов

http://www.antlr.org

Грамматики Antlr могут быть спроектированы так, чтобы позволить как разбор, так и оценку.

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

3
ответ дан 4 December 2019 в 20:23
поделиться

Предполагая, что вы можете немного изменить синтаксис, позвольте встроенной базе данных сделать эту работу за вас с запросом, подобным этому 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
2
ответ дан 4 December 2019 в 20:23
поделиться

Я посмотрел на ссылку, и она выглядит как UTF-8 для меня. то есть в Firefox, если выбрать View, Character Encoding, UTF-8, он появится правильно.

Итак, вам просто нужно выяснить, как получить ваш PHP код для обработки этого как UTF-8. Удачи!

-121--1036764-

Я также пришел к выводу, что я могу иметь одну модель, которая соответствует каждому презентатору. Таким образом, PetWidget может создавать экземпляр Pet, а PersonWidget может создавать экземпляр Person. PersonWidget может содержать один или несколько PetWidget, что в свою очередь означает, что класс Person может иметь список экземпляров Pet.

-121--5044576-

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

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

Если вы гуглите «infix to postfix» и «stack rpn calculator», вы, вероятно, найдете больше ресурсов.

0
ответ дан 4 December 2019 в 20:23
поделиться

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

0
ответ дан 4 December 2019 в 20:23
поделиться

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

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

0
ответ дан 4 December 2019 в 20:23
поделиться

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

0
ответ дан 4 December 2019 в 20:23
поделиться

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

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

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

6
ответ дан 4 December 2019 в 20:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: