好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

纯c#编写的脚本引擎(非CodeDom)

纯c#编写的脚本引擎(非CodeDom)

 前段时间有个项目,因为其中需要使用脚本做模板数据的计算,因此让我对脚本引擎产生了兴趣,于是上网到处寻找资料,于是找到了《龙书》、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,如果大家发现了请告诉我,谢谢。

  (第一次写博,大家见笑了)

    源码在此

  呵呵,感谢大家的支持!

  关于有人问这个东西在实际项目中的用处这个问题,这个嘛其实还是很多的,例如在项目中有些地方是需要用户自定义的,比如报表模板,界面模板等等。当用户需要做一些简单计算的时候,脚本引擎的作用就可以体现出来了。总不可能当用户需要在模板中做计算的时候,你来给他修改代码然后重新发布吧(这里我说的不是很清楚)。另外,作为一个程序员,多了解一些编译原理的东西总没坏处的。

  呵呵,如果对脚本引擎和编译原理感兴趣的人多的话,我也许会写一系列的博文,用最浅显的语言给你解释原理,用较简单的方法让你知道如何写一个脚本引擎。其实看了《龙书》快4个多月的时间了,其中的很多东西也还不是很明白,最快乐的就是某天的某个时刻忽然领悟其中某部分知识的时候,那种好心情能让自己高兴一整天,恨不得马上坐下写出代码来验证自己的想法。

  希望和大家一起学习,一起研究,我们是程序员,是计算机的灵魂工程师~~~呵呵

 

分类:  编译原理

标签:  编译原理 ,  c# ,  .net ,  javascript ,  脚本引擎

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于纯c#编写的脚本引擎(非CodeDom)的详细内容...

  阅读:51次

上一篇: PWMIS数据开发框架

下一篇:StackLab简介