Оцените пользовательское логическое выражение из строки

У меня есть строка параметров, которые приходят от клиента. Примером может быть:

string param = "(ИМЯ.ПОЛНОЕ ИМЯ И ДОБАВЛЯЕТСЯ НЕОБЯЗАТЕЛЬНО) ИЛИ (ИДЕНТИФИКАТОР И ДОБАВЛЕНИЕ.ТРЕБУЕТСЯ) ИЛИ (ИДЕНТИФИКАТОР И СТРАНА)"

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

Нравится :

bool name_FullName = true;
bool dob_Optional = false;

и Т. Д.

Я пытаюсь найти лучший способ оценить выражение параметра клиента как True или False.

Я думаю, просто замените параметры их истинными/ложными логическими значениями. Затем найдите любые TRUE AND TRUE, удалите их и замените TRUE AND FALSE на false. Затем оцените выражение OR, которое у меня осталось.

После ввода это кажется хорошим способом. У кого-нибудь есть более быстрые решения, которые мне не хватает?


person Jonesopolis    schedule 29.07.2013    source источник
comment
Удостоверьтесь, что вы также улавливаете скобки - если только это не всегда (И..И..И)ИЛИ(И..И...)ИЛИ...   -  person Scott Mermelstein    schedule 30.07.2013
comment
Вы смотрели на использование одного из логических парсеров на codeplex? stackoverflow.com/q/5029699/2270839   -  person Kevin    schedule 30.07.2013
comment
Несколько замечаний о решениях: 1) Обязательно учитывайте логический порядок приоритета, но пока вы правильно обращаетесь со скобками, это, вероятно, не будет проблемой, 2) Похоже, вы не собираетесь реализовать короткое замыкание, и это, вероятно, хорошо, 3) если вас интересует ясность вашего кода, это, вероятно, хорошо; если вы заинтересованы в повышении скорости (и возможностей) этого, вы можете изучить токенизацию. С очень небольшим потенциальным набором аргументов было бы очень просто использовать вместо этого массив идентификаторов токенов.   -  person TASagent    schedule 30.07.2013


Ответы (2)


Другой вариант — создать DataTable и использовать метод Select.

// create data table
var data = new DataTable();
data.Columns.Add("NAME.FULLNAME", typeof(bool));
data.Columns.Add("DOB.OPTIONAL", typeof(bool));
data.Columns.Add("ID", typeof(bool));
data.Columns.Add("DOB.REQUIRED", typeof(bool));
data.Columns.Add("COUNTRY", typeof(bool));

// fill data table
data.Rows.Add(true, false, true, true, false);

// see if it's a match
var isMatch = data.Select("(NAME.FULLNAME AND DOB.OPTIONAL) OR (ID AND DOB.REQUIRED) OR (ID AND COUNTRY)").Any();
person Michael Gunter    schedule 29.07.2013

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

Один из способов справиться с этим — заменить все TRUE OR FALSE на TRUE, а затем заменить все (TRUE) на TRUE, что должно обрабатывать все случаи, но это большая замена. Тем не менее, использование строки в качестве заполнителя состояния в вашей схеме кажется приемлемым, хотя вы можете подумать о некотором повышении производительности, вместо использования слов TRUE и FALSE с некоторой кодировкой, такой как 0 и 1 и & и | для и и или.

person welegan    schedule 29.07.2013