C#中如何将输入的字符串识别为(转化为)程序语句

时间:2021-04-12 06:43:58
我输入了一组有意义字符串(比如数学公式),如何将输入的字符串识别为(转化为)程序语句运行呢?

11 个解决方案

#1


解析

#2


Javascript中的eval("a+b")在C#应该是没有办法解释的.
也就是说有意义的字符串转换成程序语句应该是不成的,不知道高手们有没有办法

#3


*************************************************
具体问题是这样的,如果没有“有意义的字符串转换成程序语句”的话,不用上述方法也行。
我的问题是:我输入了一个公式,公式是随时会变化的,是人为输入的,是穷举不尽的,怎么能让程序中的数据按照这个公式计算?
*************************************************

#4


反射反射

#5


做得简单一点的话就用解析

如果比较复杂的公式,可能就要用到人工智能或者神经网络的了

#6


只是简单的加减乘除括号的话有现成的类 但是要用到更复杂的东西的话就要自己分析文法了。。。
编译原理的东西。。很头大

#7


通过CODEDOM+反射来处理,不过你的语句一定要正确.
CODEDOM可以临时生成代码及编译成DLL,反射可以调用生成的DLL

#8


请参考这篇文章:
动态地生成用户输入的函数表达式(C#) 
http://www.cnblogs.com/skyivben/archive/2005/10/31/265861.html

// Expression.cs - 动态生成数学表达式并计算其值 
// 表达式使用 C# 语法,可带一个的自变量(x)。 
// 表达式的自变量和值均为(double)类型。 
// 使用举例: 
//   Expression expression = new Expression("Math.Sin(x)"); 
//   Console.WriteLine(expression.Compute(Math.PI / 2)); 
//   expression = new Expression("double u = Math.PI - x;" + 
//     "double pi2 = Math.PI * Math.PI;" + 
//     "return 3 * x * x + Math.Log(u * u) / pi2 / pi2 + 1;"); 
//   Console.WriteLine(expression.Compute(0)); 
 
using System; 
using System.CodeDom.Compiler; 
using Microsoft.CSharp; 
using System.Reflection; 
using System.Text; 
 
namespace Skyiv.Util 

  sealed class Expression 
  { 
    object instance; 
    MethodInfo method; 
     
    public Expression(string expression) 
    {   
      if (expression.IndexOf("return") < 0) expression = "return " + expression + ";"; 
      string className = "Expression"; 
      string methodName = "Compute"; 
      CompilerParameters p = new CompilerParameters(); 
      p.GenerateInMemory = true; 
      CompilerResults cr = new CSharpCodeProvider().CompileAssemblyFromSource(p, string. 
        Format("using System;sealed class {0}{{public double {1}(double x){{{2}}}}}", 
        className, methodName, expression)); 
      if(cr.Errors.Count > 0) 
      { 
        string msg = "Expression(\"" + expression + "\"): \n"; 
        foreach (CompilerError err in cr.Errors) msg += err.ToString() + "\n"; 
        throw new Exception(msg); 
      } 
      instance = cr.CompiledAssembly.CreateInstance(className); 
      method = instance.GetType().GetMethod(methodName); 
    } 
     
    public double Compute(double x) 
    { 
      return (double)method.Invoke(instance, new object [] { x }); 
    } 
  } 



// ExpressionTest.cs - 动态生成数学表达式并计算其值的测试程序 
// 编译方法: csc ExpressionTest.cs Expression.cs 
 
using System; 
using Skyiv.Util; 
 
namespace Skyiv.Test 

  class ExpressionTest 
  { 
    static void Main(string [] args) 
    { 
      try 
      { 
        if (args.Length > 0) 
        { 
          Console.WriteLine("f(x): {0}", args[0]); 
          Expression expression = new Expression(args[0]); 
          for (int i = 1; i < args.Length; i++) 
          { 
            double x = double.Parse(args[i]); 
            Console.WriteLine("f({0}) = {1}", x, expression.Compute(x)); 
          } 
        } 
        else Console.WriteLine("Usage: ExpressionTest expression [ parameters  ]"); 
      } 
      catch (Exception ex) 
      { 
        Console.WriteLine("错误: " + ex.Message); 
      } 
    } 
  } 

#9


学习

帮顶

#10


如果只是解析数学公式的话方法也不少,差不多5到6种

1.按逆波兰表达式自己解析
2.使用第三方语言引擎ironpython ,jscript,javascript,vbscript
3.使用codedom
4.反射
5.借用dataTable运算
6.使用第三方科学计算工具如:matlab,labview,excel


#11


谢谢大家的帮助!!!

#1


解析

#2


Javascript中的eval("a+b")在C#应该是没有办法解释的.
也就是说有意义的字符串转换成程序语句应该是不成的,不知道高手们有没有办法

#3


*************************************************
具体问题是这样的,如果没有“有意义的字符串转换成程序语句”的话,不用上述方法也行。
我的问题是:我输入了一个公式,公式是随时会变化的,是人为输入的,是穷举不尽的,怎么能让程序中的数据按照这个公式计算?
*************************************************

#4


反射反射

#5


做得简单一点的话就用解析

如果比较复杂的公式,可能就要用到人工智能或者神经网络的了

#6


只是简单的加减乘除括号的话有现成的类 但是要用到更复杂的东西的话就要自己分析文法了。。。
编译原理的东西。。很头大

#7


通过CODEDOM+反射来处理,不过你的语句一定要正确.
CODEDOM可以临时生成代码及编译成DLL,反射可以调用生成的DLL

#8


请参考这篇文章:
动态地生成用户输入的函数表达式(C#) 
http://www.cnblogs.com/skyivben/archive/2005/10/31/265861.html

// Expression.cs - 动态生成数学表达式并计算其值 
// 表达式使用 C# 语法,可带一个的自变量(x)。 
// 表达式的自变量和值均为(double)类型。 
// 使用举例: 
//   Expression expression = new Expression("Math.Sin(x)"); 
//   Console.WriteLine(expression.Compute(Math.PI / 2)); 
//   expression = new Expression("double u = Math.PI - x;" + 
//     "double pi2 = Math.PI * Math.PI;" + 
//     "return 3 * x * x + Math.Log(u * u) / pi2 / pi2 + 1;"); 
//   Console.WriteLine(expression.Compute(0)); 
 
using System; 
using System.CodeDom.Compiler; 
using Microsoft.CSharp; 
using System.Reflection; 
using System.Text; 
 
namespace Skyiv.Util 

  sealed class Expression 
  { 
    object instance; 
    MethodInfo method; 
     
    public Expression(string expression) 
    {   
      if (expression.IndexOf("return") < 0) expression = "return " + expression + ";"; 
      string className = "Expression"; 
      string methodName = "Compute"; 
      CompilerParameters p = new CompilerParameters(); 
      p.GenerateInMemory = true; 
      CompilerResults cr = new CSharpCodeProvider().CompileAssemblyFromSource(p, string. 
        Format("using System;sealed class {0}{{public double {1}(double x){{{2}}}}}", 
        className, methodName, expression)); 
      if(cr.Errors.Count > 0) 
      { 
        string msg = "Expression(\"" + expression + "\"): \n"; 
        foreach (CompilerError err in cr.Errors) msg += err.ToString() + "\n"; 
        throw new Exception(msg); 
      } 
      instance = cr.CompiledAssembly.CreateInstance(className); 
      method = instance.GetType().GetMethod(methodName); 
    } 
     
    public double Compute(double x) 
    { 
      return (double)method.Invoke(instance, new object [] { x }); 
    } 
  } 



// ExpressionTest.cs - 动态生成数学表达式并计算其值的测试程序 
// 编译方法: csc ExpressionTest.cs Expression.cs 
 
using System; 
using Skyiv.Util; 
 
namespace Skyiv.Test 

  class ExpressionTest 
  { 
    static void Main(string [] args) 
    { 
      try 
      { 
        if (args.Length > 0) 
        { 
          Console.WriteLine("f(x): {0}", args[0]); 
          Expression expression = new Expression(args[0]); 
          for (int i = 1; i < args.Length; i++) 
          { 
            double x = double.Parse(args[i]); 
            Console.WriteLine("f({0}) = {1}", x, expression.Compute(x)); 
          } 
        } 
        else Console.WriteLine("Usage: ExpressionTest expression [ parameters  ]"); 
      } 
      catch (Exception ex) 
      { 
        Console.WriteLine("错误: " + ex.Message); 
      } 
    } 
  } 

#9


学习

帮顶

#10


如果只是解析数学公式的话方法也不少,差不多5到6种

1.按逆波兰表达式自己解析
2.使用第三方语言引擎ironpython ,jscript,javascript,vbscript
3.使用codedom
4.反射
5.借用dataTable运算
6.使用第三方科学计算工具如:matlab,labview,excel


#11


谢谢大家的帮助!!!