求一个很基础的c#代码!!万分感谢!!!

2024-12-28 23:35:40
推荐回答(5个)
回答1:

我知道有两种方式可以实现,
1.利用正则表达式进行语义分析,这种方式需要考虑的东西太多。
2.利用C#对“动态语言”的支持。也就是说,将654*6+65-27/654整个字符串当做一个string类型参数传入某一方法 然后返回执行后的结果,相信这个应该很适合你,下面是一个类,你直接用以下方法调用即可:
如:
public class ProgramTest
{
static void Main(string[] args)
{
string res = string.Empty;
string error = string.Empty;

res = Evaluator.ReturnRsult("654*6+65-27/654", out error); //这里就是你要传进去的式子,只要是标准的式子便可。
if (!string.IsNullOrEmpty(error))
{
Console.WriteLine(error);
}
else
{
Console.WriteLine("执行结果为:" + res);
}
Console.Read();
}
}

------
下面就是实现功能的类,copy到您的程序中就行,注意引用到的名字空间有:
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Text.RegularExpressions;
------------------------

///


/// C#代码执行器,提供动态执行C#代码
///

public class Evaluator
{
private static CSharpCodeProvider cCodeProder = null;
private static CompilerParameters compPars = null;
private static CompilerResults compResult = null;
private static Regex rexLastCode = new Regex(@"(print:).+;\s*$", RegexOptions.Compiled | RegexOptions.IgnoreCase); //用于搜索最后一条代码的位置

static Evaluator()
{
cCodeProder = new CSharpCodeProvider();
}

///
/// 执行指定的代码
///

///
///
private static string Eval(string strCodes, out string strErrText)
{
#region 编译代码
strErrText = InitCompile(ref strCodes);
if (strErrText != null) return null;
try
{
compResult = cCodeProder.CompileAssemblyFromSource(compPars, new string[] { strCodes });
}
catch (NotImplementedException nie)
{
strErrText = nie.Message;
return null;
}

if (compResult.Errors.HasErrors)
{
StringBuilder sbErrs = new StringBuilder(strCodes + System.Environment.NewLine);
sbErrs.Append("您所提供的C#代码中存在语法错误!" + System.Environment.NewLine);
foreach (CompilerError err in compResult.Errors)
{
sbErrs.AppendFormat("{0},{1}" + System.Environment.NewLine, err.ErrorNumber, err.ErrorText);
}
strErrText = sbErrs.ToString();
return null;
}
#endregion

Assembly assembly = compResult.CompiledAssembly;
object prgInsl = assembly.CreateInstance("System._ClassEvaluatorCompiler");
MethodInfo medInfo = prgInsl.GetType().GetMethod("PrintResult");
string strRetn;
try
{
strRetn = medInfo.Invoke(prgInsl, null).ToString();
return strRetn;
}
catch (Exception exMsg)
{
strErrText = exMsg.Message;
return null;
}
}

///
/// 预编译代码
///

/// 待编译的源代码
/// 如果错误则返回错误消息
private static string InitCompile(ref string strCodes)
{
List lstRefs = new List();//代码字符串中的include引用程序集------未使用

List lstUsings = new List();//代码字符串中的using引用命名空间

#region 分离引用的程序集与命名空间
int point = 0;
string strTemp;
char[] cCodes = strCodes.ToCharArray();
for (int i = 0; i < cCodes.Length; ++i)
{
if (cCodes[i] == '\n' || (cCodes[i] == '\r' && cCodes[i + 1] == '\n'))
{
strTemp = strCodes.Substring(point, i - point);
if (strTemp.TrimStart(new char[] { ' ' }).StartsWith("using "))
{
strTemp = strTemp.Substring(6).Trim();
if (!lstUsings.Contains(strTemp))
{
lstUsings.Add(strTemp);
}
else
{
return "预编译失败,代码中不允许包含重复命名空间导入。" + System.Environment.NewLine + "using " + strTemp;
}
point = cCodes[i] == '\n' ? i + 1 : i + 2;
++i;
}
else if (strTemp.TrimStart(new char[] { ' ' }).StartsWith("include "))
{
strTemp = strTemp.Substring(8).Trim().ToLower();
if (!lstRefs.Contains(strTemp))
{
lstUsings.Add(strTemp);
}
else
{
return "预编译失败,代码中不允许包含重复的程序集引用。" + System.Environment.NewLine + "include " + strTemp;
}
point = cCodes[i] == '\n' ? i + 1 : i + 2;
++i;
}
else
{
break;
}
}
}
strCodes = strCodes.Substring(point);
#endregion

#region 初始化编译参数
if (compPars == null)
{
compPars = new CompilerParameters();
compPars.GenerateExecutable = false;
compPars.GenerateInMemory = true;
}
//string workDir = System.Web.HttpContext.Current.Server.MapPath("~") + "Bin\\";
//string workDir = System.Environment.CurrentDirectory;
compPars.ReferencedAssemblies.Clear();
compPars.ReferencedAssemblies.Add("system.dll");
compPars.ReferencedAssemblies.Add("system.data.dll");
compPars.ReferencedAssemblies.Add("system.xml.dll");

//compPars.ReferencedAssemblies.Add(workDir + "BLL.dll");
//compPars.ReferencedAssemblies.Add(workDir + "Component.dll");
//compPars.ReferencedAssemblies.Add(workDir + "Model.dll");
//compPars.ReferencedAssemblies.Add(workDir + "Utility.dll");

foreach (string str in lstRefs)
{
compPars.ReferencedAssemblies.Add(str);
}
#endregion

StringBuilder sbRetn = new StringBuilder();

#region 生成代码模板
///*为代码添加return 语句*/
Match match = rexLastCode.Match(strCodes);
if (match.Success)
{
strCodes = string.Format("{0}\r\nreturn {1}", strCodes.Substring(0, match.Groups[1].Index), strCodes.Substring(match.Groups[1].Index + match.Groups[1].Length));
}
else
{
strCodes = strCodes.Trim();//把要运行的代码字符串作为返回值---作为输出 - 显示运行的字符串源码
}

/*拼接代码*/
foreach (string str in lstUsings)
{
sbRetn.AppendLine("using " + str);
}
sbRetn.AppendLine("namespace System{");
sbRetn.AppendLine("public class _ClassEvaluatorCompiler{");
sbRetn.AppendLine("public static object PrintResult(){");
sbRetn.AppendLine(strCodes);
sbRetn.AppendLine("}}}");
#endregion
strCodes = sbRetn.ToString();
return null;
}

///
/// 执行一段表达式
///

/// 要执行的表达式字符串
/// 错误提示语句
/// 返回执行结果
public static string ReturnRsult(string info, out string error)
{
string returnStr = string.Empty;
info = "return " + info + ";";
returnStr = Eval(info, out error);
return returnStr;
}
}

回答2:

分析多项式?
这貌似不是那么简单的问题.
好好想想吧,如果你初学,老师不会让你做这东西的..
顶多做个计算器什么的..
这涉及到字符串处理,正则之类的语法分析有关的东西..

回答3:

return 654*6+65-27/654;

回答4:

这么多东西要一下实现吗?具体什么意思。星期1在线的告诉你怎么写。

回答5:

你写个计算器不就OK了