比如 "500<400|200>4000&5000<=100|!1"就要演化成 以下 这种 
 if (500<400|200>4000&5000<=100|!1)
    
需要可能有 ()  ,优先级,最内的 () 优先级最高 !!因为是字符串 ,所以需要 判断 
javascript 中 有eval  
在net 中如何 作 ?? 
表达能力不行 .不知道 大家看的懂吗?

解决方案 »

  1.   

    嘿 没错 就是编译原理 的算法了 
    但是暂时不需要那么复杂 
    只需要简单 几个符号 
    () 有限级 
     ! 逻辑非运算符
     & 逻辑与
     | 逻辑或
     >= ,> ,== < ,<=   
    这些符号 而已 !!
      

  2.   

    我还不清楚你具体需要什么,优先级主要是指什么?括号在字符串中吗?如果是的话,可以考虑用正则表达式将字符串中的括号提取出来。
    \((?>[^()]+|\((?<Depth>)|\)(?<-Depth>))*(?(Depth)(?!))\)提取的括号里面可以包括括号,你可以作一个循环提取,至于怎么演化为
    if (500<400|200>4000&5000<=100|!1)
    这种形式,这是指一般的字符串还是脚本??有点不明白???^_^
      

  3.   

    呵呵 这么说把 "?<400|?>4000&?<=100|!?"
    上面是 数据库中的一个字符串 !!   条件配置字符串 !! 
    通过一些列算法  演化为 "500<400|200>4000&5000<=100|!1" 这个字符串 因为是条件  所以必须计算出 数值为 真或者假 !!
    但是总不能用 字符串拿来判断 ! 
    所以需要一个算法 成为代码中可执行的 判断语句 
    if (500<400|200>4000&5000<=100|!1)
      应该比较情绪了
      

  4.   

    你是要自己判断这个式子(500<400|200>4000&5000<=100|!1)是否正确吗?
    如果这样的话,用数据结构中介绍的四则运算的方法就足够了!如果if (500<400|200>4000&5000<=100|!1)需要使用的,直接用 if(true)或者if(false)代替就可以了!
      

  5.   

    呵呵,使用CodeDom来个动态编译应该可行,要不分析字符串,按照堆栈的形式来写个类
      

  6.   

    http://www.ccw.com.cn/htm/center/prog/02_10_23_3.asp
      

  7.   

    在net 中也可写javascript语句啊Response。write("<script language=javascript>...</script>")
      

  8.   

    using  System;  
    using  System.CodeDom;  
    using  System.CodeDom.Compiler;  
    using  Microsoft.CSharp;  
    using  System.Reflection;  
    using  System.Text;  
             /// <summary>
    /// Eval 的摘要说明。
    /// </summary>
    public class Eval
    {
    public  static  object  Calc(string  expression)  
    {  
    string  className  =  "Calc";  
    string  methodName  =  "Run";  
    expression=expression.Replace("/","*1.0/");
                             
    //  创建编译器实例。  
    ICodeCompiler  complier  =  (new  CSharpCodeProvider().CreateCompiler());  
    //  设置编译参数。  
    CompilerParameters  paras  =  new  CompilerParameters();  
    paras.GenerateExecutable  =  false;  
    paras.GenerateInMemory  =  true;  
     
    //  创建动态代码。  
    StringBuilder  classSource  =  new  StringBuilder();    
    classSource.Append("public  class  "+  className  +"\n");  
    classSource.Append("{\n");  
    classSource.Append("        public  object  "  +  methodName  +  "()\n");  
    classSource.Append("        {\n");  
    classSource.Append("                return  "+  expression  +  ";\n");  
    classSource.Append("        }\n");  
    classSource.Append("}");  
     
    //System.Diagnostics.Debug.WriteLine(classSource.ToString());  
     
    //  编译代码。  
    CompilerResults  result  =  complier.CompileAssemblyFromSource(paras,  classSource.ToString());  
                             
    //  获取编译后的程序集。  
    Assembly  assembly  =  result.CompiledAssembly;  
       
    //  动态调用方法。  
    object  eval  =  assembly.CreateInstance(className);  
    MethodInfo  method  =  eval.GetType().GetMethod(methodName);  
    object reobj = method.Invoke(eval,  null);  
    GC.Collect();
    return reobj; }  
    }
      

  9.   

    调用方法:Eval.Calc("500<400|200>4000&5000<=100|!1")