.NET

2009-03-27 21 views
5

'daki karmaşık boole koşulunu string'ten boole dönüştürün Karmaşık açıklamayı string'ten bool'e ayrıştırmam gerekiyor..NET

Sadece içerebilir: (doğru/yanlış)
* boolean değerlerini,
* parantezi,
* VE/VEYA işlenen (& &, ||)

Örn:

bool.Parse("((true || false) && (false || false)) || (true || false)" 

Bunu nasıl başarırsınız?

cevap

6

Size C# kodu içinde JScript.NET Eval işlevini veren kurnaz bir değerlendirici sınıfı:

static public class Evaluator 
{ 
    private const string _jscriptSource = 
     @"package Evaluator 
     { 
      class Evaluator 
      { 
       public function Eval(expr : String) : String 
       { 
       return eval(expr); 
       } 
      } 
     }"; 

    static private object _evaluator; 
    static private Type _evaluatorType; 

    [SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline", 
     Justification = "Can't be done inline - too complex")] 
    static Evaluator() 
    { 
     InstantiateInternalEvaluator(); 
    } 

    static private void InstantiateInternalEvaluator() 
    { 
     JScriptCodeProvider compiler = new JScriptCodeProvider(); 

     CompilerParameters parameters; 
     parameters = new CompilerParameters(); 
     parameters.GenerateInMemory = true; 

     CompilerResults results; 
     results = compiler.CompileAssemblyFromSource(parameters, _jscriptSource); 

     Assembly assembly = results.CompiledAssembly; 
     _evaluatorType = assembly.GetType("Evaluator.Evaluator"); 

     _evaluator = Activator.CreateInstance(_evaluatorType); 
    } 

    static public int EvaluateToInteger(string statement) 
    { 
     string s = EvaluateToString(statement); 
     return int.Parse(s); 
    } 

    static public double EvaluateToDouble(string statement) 
    { 
     string s = EvaluateToString(statement); 
     return double.Parse(s); 
    } 

    static public decimal ForceEvaluateToDecimal(string statement) 
    { 
     decimal result; 
     bool s = Decimal.TryParse(statement, out result); 
     return result; 
    } 

    static public decimal EvaluateToDecimal(string statement) 
    { 
     string s = EvaluateToString(statement); 
     return decimal.Parse(s); 
    } 

    static public string EvaluateToString(string statement) 
    { 
     object o = EvaluateToObject(statement); 
     return o.ToString(); 
    } 

    static public bool EvaluateToBool(string statement) 
    { 
     object o = EvaluateToObject(statement); 
     return (bool)o; 
    } 

    static public object EvaluateToObject(string statement) 
    { 
     try 
     { 
      return _evaluatorType.InvokeMember(
       "Eval", 
       BindingFlags.InvokeMethod, 
       null, 
       _evaluator, 
       new object[] {statement} 
       ); 
     } 
     catch (Exception) 
     { 
      InstantiateInternalEvaluator(); 
      return null; 
     } 
    } 
} 

Yalnızca Evaluator.EvaluateToBool (dizesi) 'yi arayın. Mevcut bir projeden kaldırıldı, böylece çimdiklemek isteyebilirsiniz!

+0

harika! PS EvaluateToBool'un bool dönüşü var – Maciej

+0

BTW Performans hakkında ne düşünüyorsunuz? Bunun bir sorun olabileceğini düşünüyor musunuz? – Maciej

+0

"Maciej (ilk yorum) - okul çocuğu kopyala, yapıştır ve düzgün bir şekilde düzenleyemem. Düzenleyecektir. –

0

standart bir yöntemdir: string

  • inşa ifadesini
  • değerlendiren ağacı ziyaret her yaprağın
  • her düğümünde bir operatör ve bir işlenen koyarak bir ağaç tokenize

  • 2

    Açıkladığınız dize geçerli C# kodudur, bu nedenle çalışma zamanında yorumlayabiliyorsanız tamamlanır. Birçok dilde bu yerleşik bir işlevdir. C# değil, ancak bu gibi bir 3. parti kitaplığı kullanabilirsiniz, bu runtime C# interpreter

    +0

    Çalışma Zamanı C# İfade Değerlendiricisi bahsettiğinizde ilginç görünüyor ancak indirme linki bozuk görünüyor - kaynak var mı? – Maciej

    +0

    Üzgünüz - çalışmaya başladım şimdi – Maciej