日期:2014-05-20  浏览次数:20900 次

看到好的东西就想转 纯c#编写的脚本引擎(非CodeDom) 来自 天雲原创
引自,天雲
原创地址 http://www.cnblogs.com/TianY/archive/2012/09/27/2704267.html
前段时间有个项目,因为其中需要使用脚本做模板数据的计算,因此让我对脚本引擎产生了兴趣,于是上网到处寻找资料,于是找到了《龙书》、CodeDom。于是又找了半天,找不到开源的脚本引擎源码,脑袋一热,干脆自己写一个,于是就有了这个用纯c#(非CodeDom)编写的脚本引擎。编写过程中收获良多,目前还不是很完善,效率也不高,仅供学习用,后面会上传源代码。

  下面说明一下:语法参考Javascript,基本的javascript语法都已实现,但是有些内建对象没实现,例如 Date,数据类型支持 数值,字符串(考虑到在代码中执行代码,所以字符串的定义用 '字符串' 而非 "字符串"),对象,布尔值,数组。语法方面基本参考Javascript就行了。在编写这个东西的时候顺带学习了下CodeDom(感叹枉费我弄C#也4年多了,现在才知道这东西,看来水还是太深了),在考虑语法分析的时候就参考了CodeDom的对象结构,如下:



  命名空间定义:

    ScriptEngin.Code :词法分析器

    ScriptEngin.CodeDom:编译后的解释模型,就是上图的结构(都说了是参考CodeDom)

    ScriptEngin.Exceptions:自定义的异常类

     ScriptEngin.Parser:语法分析器

    ScriptEngin.RunTime:运行时解释执行器

    ScriptEngin.RunTimeType:处理c#对象和脚本对象的映射(还未完善)

  下面贴一段调用代码:

    


 1 string code1 = @"
 2 var str='字符串申明';
 3 var obj={name:'对象申明',num:100,fun:function(a,b){return a+b;}};
 4 var arr=['这个是数组','123'];
 5 var arr2=[['多维数组','111'],['222','223']];
 6 
 7 function testClass()
 8 {
 9 this.name='成员属性';
10 this.MemFun=function(){
11 return '成员函数';
12 }
13 }
14 var newObj=new testClass();
15 var nameMem=newObj.name;
16 
17 
18 function testFun(a,v)
19 {
20 count=0;
21 for(i=0;i<v;i++)
22 {
23 count+=a;
24 }
25 return count;
26 }
27 
28 
29 ";
30 Script scr = new Script();
31 scr.Paramers.Set("testbool", true);
32 scr.Paramers.Set("testString", "abc");
33 
34 scr.Run(code1);
35 
36 //获取运行时变量,PS:暂时只能返回数值、字符串、Boolean值
37 object varValue = scr.Paramers.Get("str");
38 
39 //调用指定函数,能返回的数据同上
40 object value= scr.Call("testFun",300,200);

   目前未做大量测试,可能会存在些许Bug,如果大家发现了请告诉我,谢谢。


转自http://www.cnblogs.com/TianY/archive/2012/09/27/2704267.html 不是本人所写。可比我写的好多了。
.net就是应该有这样的人。

------解决方案--------------------
每次见到楼主的头像都想晕,感谢楼主分享
------解决方案--------------------
感谢分享
------解决方案--------------------
分享分享 GOODGOOD
------解决方案--------------------
收藏了,有时间研究下。
------解决方案--------------------
顶,有意思。。。我还得多学习学习
------解决方案--------------------
作为学习来说貌似不错,当然,实际上.net本身支持拿javascript以及iron languages作为脚本了,相比较之,恐怕实用来说还是粗糙了些。
------解决方案--------------------
这个东西写着玩玩吧。
------解决方案--------------------
感谢楼主分享 接分~
------解决方案--------------------
编程的东西我不懂!
------解决方案--------------------
学习一下,最近对编写脚本引擎挺有兴趣
------解决方案--------------------
谢谢分享,太好了GOOD
------解决方案--------------------
开始入门了

------解决方案--------------------
感谢楼主分享
------解决方案--------------------
感谢分享,学习啦