Я пишу приложение, которое позволяет пользователю вводить булево выражение. Мне нужна способность оценить вводимое булево выражение во времени выполнения, и ищу и синтаксический анализатор и 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
Грамматики Antlr могут быть спроектированы так, чтобы позволить как разбор, так и оценку.
Вот пример: http://www.antlr.org/wiki/display/ANTLR3/Expression+evaluator
Предполагая, что вы можете немного изменить синтаксис, позвольте встроенной базе данных сделать эту работу за вас с запросом, подобным этому 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
Я посмотрел на ссылку, и она выглядит как 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», вы, вероятно, найдете больше ресурсов.
Для этого вы можете использовать библиотеку dotMath .
Вот отличный анализатор оценки Codeproject , который использует метод eval и не полагается на CodeDOM или что-то подобное. Вот отличная статья о создании оценщика выражений с использованием Antlr, также на том же сайте ..
Надеюсь, это поможет, С уважением, Том.
Этот тип вещей - хлеб и масло F#. Вы можете попробовать. Для разбора используйте рекурсивный спуск, тогда вы сможете пробежаться по получившемуся дереву. Если у вас есть контроль над входным языком, вы можете обойтись операцией цитирования.
В нашем проекте используется NCalc (с ANTLR внизу для лексирования / синтаксического анализа), и мы очень им довольны.
NCalc - это вычислитель математических выражений в .NET. NCalc может анализировать любое выражение и оценивать результат, включая статические или динамические параметры и пользовательские функции.
Наше приложение требует, чтобы оно было скомпилировано как для полной, так и для компактной платформы. С помощью относительно простых настроек мы смогли заставить NCalc и ANTLR работать для обоих вариантов фреймворка.