网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
06月12日漏签0天
原创软件吧 关注:1,248贴子:3,868
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 10回复贴,共1页
<<返回原创软件吧
>0< 加载中...

【开源帖】教你用反射做表达式计算器

  • 只看楼主
  • 收藏

  • 回复
  • supr1c
  • 富有名气
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
首先 我们需要知道 在各种语言里面 都是可以直接计算表达式的
比如(以C#为例)
using System;
public static class Driver
{
public static void Run()
{
Double i = 1+2+3;
Console.WriteLine(\"=\"+ i);
}
}
那么就会在控制台输出1+2+3的值 就是6
所以利用这个就能做一个计算器 把上面的东西编译运行就OK 所以用到反射
下面是代码
using System;using System.CodeDom.Compiler;using System.IO;using System.Reflection;using System.Text;using Microsoft.CSharp;
namespace ExpressionCalculator{ class Program { static void Main(string[] args) { Console.WriteLine("ExpressionCalculator 2012-8-26 By fuis"); Console.WriteLine("Enter a expression and press enter key, or an empty line to exit."); String str = Console.ReadLine(); if (str != String.Empty) { CodeDriver driver = new CodeDriver(); Boolean isError; Console.WriteLine(driver.CompileAndRun(str, out isError)); if (isError) { Console.WriteLine("Some Errors happened."); } Console.WriteLine("Press enter key to exit."); Console.ReadLine(); } }
}
public class CodeDriver : MarshalByRefObject { private string prefix = "using System;" + "public static class Driver" + "{" + " public static void Run()" + " {" + "Double i = ";
private string postfix = ";" + "Console.WriteLine(\"=\"+i);" + " }" + "}";
public string CompileAndRun(String input, out Boolean hasError) { hasError = false; String returnData = null;
CompilerResults results = null; using (var provider = new CSharpCodeProvider()) { var options = new CompilerParameters(); options.GenerateInMemory = true;
var sb = new StringBuilder(); sb.Append(prefix); sb.Append(input); sb.Append(postfix);
results = provider.CompileAssemblyFromSource(options, sb.ToString()); }
if (results.Errors.HasErrors) { hasError = true; var errorMessage = new StringBuilder(); foreach (CompilerError error in results.Errors) { errorMessage.AppendFormat("{0} {1}", error.Line, error.ErrorText); } returnData = errorMessage.ToString(); } else { TextWriter temp = Console.Out; var writer = new StringWriter(); Console.SetOut(writer); Type driverType = results.CompiledAssembly.GetType("Driver");
driverType.InvokeMember("Run", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null, null); Console.SetOut(temp);
returnData = writer.ToString(); }
return returnData; } }
}
好吧 我还是放图片 度娘略凌乱
太慢了 传个图片


  • 苗玉珠
  • 富有美誉
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


2025-06-12 15:59:41
广告
  • wxd356
  • 锋芒毕露
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这玩意你翻几页就可以看到我自己做的一个,用的原理听人家讲好像是递归下降。我现在手头就有一本编译原理。你这个完全就是用现成的东西嘛


  • twtyypmb123
  • 默默无闻
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
要么用栈,要么用树,你这个算什么。。。


  • oshi001
  • 闻名一方
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@大概过分
看看,学着点,长进下.说不定以后有点出息.


  • bluewaterx
  • 小有美名
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
开源的必须顶


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 10回复贴,共1页
<<返回原创软件吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示