2014-01-23 4 views
0

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

string1: "True and False" 
bool: false 

string1: "False and False" 
bool: false 

string1: "true or False" 
bool: true 
+5

Это так сложно, как это» я когда-нибудь получу? Или вы можете иметь что-то вроде '(true или false) и true'? –

+2

Проверьте эти ответы: http://stackoverflow.com/a/5029797/725844 – Frode

+0

http://stackoverflow.com/a/13256816/932418 –

ответ

0

До тех пор, как он всегда будет следовать за простой структурой, заданной в ваших примерах, это будет работать:

private static readonly Regex boolParseRegex = 
    new Regex(@"^(true|false) (and|or) (true|false)$", RegexOptions.IgnoreCase); 
public bool ParseExpression(string expr) 
{ 
    var res = boolParseRegex.Match(expr); 
    bool val1 = bool.Parse(res.Groups[1].Value); 
    bool isAnd = string.Equals(res.Groups[2].Value, "and", 
           StringComparison.InvariantCultureIgnoreCase); 
    bool val2 = bool.Parse(res.Groups[3].Value); 
    return isAnd ? val1 && val2 : val1 || val2; 
} 

Если вы хотите, чтобы иметь возможность анализировать более общие выражения (например, "true", "(true and false) or true", в дополнение к "false and true"), вы должны взглянуть на Irony, как рекомендовано в ответе convert string expression to a boolean expression (спасибо Frode за комментарий).

0

Что вы хотите, может быть достигнуто, если вы реализуете парсер или используете библиотеку синтаксического анализа. В основном вам нужно разбить свое выражение на его компоненты, а затем интерпретировать их как логические блоки; ваши образцы содержат два типа, значения и операторы.

Давайте попробуем это на первом примере, True AND False:

True <- value  : Carry it over 
AND <- operator : store 
False <- Value  : Use stored Operation on Carried value. Carry it over. 
End of expression 

Вещи становятся немного более сложным, если вы добавить группировку, потому что нужно хранить последовательности в структуре часто называют дерево выражения, потому что он иерархический и требует, чтобы вы анализировали каждую группу, начиная с «листьев» (наиболее удаленных от корня). Давайте будем использовать следующий пример:

False XOR (True AND False) OR (True OR False) 

Выражение дерево будет выглядеть следующим образом:

Root Group  : False XOR G1 OR G2 
    Group 1   : True AND False 
    Group 2   : True OR False 

Использование вашей оценки выражений, вы должны сначала решить группы 1 и 2:

Root Group  : False XOR G1 OR G2 
    Group 1   : False 
    Group 2   : True 

Затем примените его к корневой группе:

Root Group   : False XOR False OR True 

False <- value  : Carry it over 
XOR <- operator : store 
False <- value  : Apply stored Operation (result True). Carry it over. 
AND <- operator : store 
False <- Value  : Apply stored Operation (result True). Carry it over. 
- End of expression 

Вот как работает парсер выражений.

Edit: Irony, указал Фрод на комментарий на ваш вопрос, является хорошо известным языком анализатора, который может сделать трюк для вас. Я помню, как читал об этом некоторое время назад, но он был быстрее меня. =)

0

что-то просто может быть:

static bool string_parser(string str_to_parse) 
     { 
      bool result= false; 
      string[] parts = str_to_parse.Split(' '); 
      if (parts.Length == 3) 
      { 
       if (parts[0].ToLower().Contains("true")) 
       { 
        result = true; 
       } 
       if (parts[1].ToLower().Contains("or")) 
       { 
        if (parts[2].ToLower().Contains("true")) 
        { 
         result= result || true; 
        } 
       } 
       else if (parts[1].ToLower().Contains("and")) 
       { 
        result = parts[2].ToLower().Contains("true") ? result && true : result && false; 
       } 
      } 
      return result; 
     } 

но интересно Ложные & & Ложные не должно быть «True» в этом примере ложного & & ложь является ложным

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