时间有个项目,因为其中需要使用脚本做模板数据的计算,因此让我对脚本引擎产生了兴趣,于是上网到处寻找资料,于是找到了《龙书》、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
 3 var str='字符串申明';
 4 var obj={name:'对象申明',num:100,fun:function(a,b){return a+b;}};
 5 var arr=['这个是数组','123'];
 6 var arr2=[['多维数组','111'],['222','223']];
 7
 8 function testClass()
 9 {
10     this.name='成员属性';
11     this.MemFun=function(){
12         return '成员函数';
13     }
14 }
15 var newObj=new testClass();
16 var nameMem=newObj.name;
17
18
19 function testFun(a,v)
20 {
21    count=0;
22    for(i=0;i<v;i++)
23    {
24        count+=a;
25    }
26    return count;
27 }
28
29
30 ";
31             Script scr = new Script();
32             //设置传入脚本的参数,这里传入的参数在脚本中可做变量用
33             scr.Paramers.Set("testbool", true);
34             scr.Paramers.Set("testString", "abc");
35
36             //编译并运行全局代码
37             scr.Run(code1);
38
39             //获取运行时变量,PS:暂时只能返回数值、字符串、Boolean值
40             object varValue = scr.Paramers.Get("str");
41
42             //调用指定函数,能返回的数据同上
43             object value= scr.Call("testFun",300,200);

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

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

  源码在此


  呵呵,感谢大家的支持!

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

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

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

纯c#编写的脚本引擎(非CodeDom)相关推荐

  1. 在windows程序中嵌入Lua脚本引擎--编写自己的Lua库

    在<在windows程序中嵌入Lua脚本引擎--建立一个简易的"云命令"执行的系统>一文中,我提到了使用Lua的ffi库,可以让我们像写C代码一样写lua程序.这是个非 ...

  2. 【网络攻防课实验】五:Nmap脚本引擎 (NSE) 的使用及脚本编写

    文章目录 实验简述 实验环境 实验内容 1.初识NSE 2.NSE参数 3.输出细节 4.脚本格式 5.编写脚本 实验总结 实验简述 Nmap具有强大的脚本引擎NSE(Nmap Scripting E ...

  3. autojs免root脚本引擎编写的QQ空间点赞脚本源码

    说明 本文提供的代码仅供参考.不建议用于生产环境. 可能有些地方在最新版本的Auto.js上面需要做修改,才能运行. Auto.js简介 Auto.js是利用安卓系统的"辅助功能" ...

  4. autojs Pro免root脚本引擎编写的获取本地时间及网络时间验证

    说明 本文提供的代码仅供参考.不建议用于生产环境. 可能有些地方在最新版本的Auto.js上面需要做修改,才能运行. Auto.js简介 Auto.js是利用安卓系统的"辅助功能" ...

  5. autojs免root脚本引擎编写的本地音乐播放器源代码开源

    说明 本文提供的代码仅供参考.不建议用于生产环境. 可能有些地方在最新版本的Auto.js上面需要做修改,才能运行. Auto.js简介 Auto.js是利用安卓系统的"辅助功能" ...

  6. 基于autojs的安卓免root脚本引擎编写的QQ文字换语言发送全自动脚本

    说明 本文提供的代码仅供参考.不建议用于生产环境. 可能有些地方在最新版本的Auto.js上面需要做修改,才能运行. Auto.js简介 Auto.js是利用安卓系统的"辅助功能" ...

  7. autojs脚本引擎编写的百度网盘BDUSS获取代码

    说明 本文提供的代码仅供参考.不建议用于生产环境. 可能有些地方在最新版本的Auto.js上面需要做修改,才能运行. Auto.js简介 Auto.js是利用安卓系统的"辅助功能" ...

  8. Java版AVG游戏开发入门示例 3 ——脚本引擎的制作及应用

    源码下载地址:http://code.google.com/p/loon-simple/downloads/list 根据wikipedia的解释:脚本语言(Script language,scrip ...

  9. Java版AVG游戏开发入门示例[3]——脚本引擎的制作及应用

    源码下载地址:http://code.google.com/p/loon-simple/downloads/list 根据wikipedia的解释:脚本语言(Script language,scrip ...

最新文章

  1. SAP COR2下达工单,报错 System status APNG is active 之对策
  2. Struts2 入门修行第一天 | 小节二
  3. mini CentOS7 安装 mysql
  4. error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏的解决方案
  5. 春天:注入列表,地图,可选对象和getBeansOfType()陷阱
  6. java学习(9):巩固练习
  7. 阿里云高校“在家实践”计划,免费提供2.68亿小时算力!
  8. ftp ---- 配置文件(默认配置文件解读)
  9. 4-1 ADO.NET简介 4
  10. toolchain安装教程支持_网上现成toolchain安装操作
  11. 数据库时间慢了14个小时,Mybatis说,这个锅我不背~
  12. python 把矩阵变成一维_python矩阵转换为一维数组的实例
  13. 加州房价预测项目详细笔记(Regression)——(3)准备数据(数据的预处理)
  14. 成功安装python后、在dos命令行窗口中-python在WIN运行时去掉DOS窗口显示的方法
  15. 为什么计算机播放音乐不响,电脑打开音响,播放音乐为什么没有声音??!!~急急急!!快! 爱问知识人...
  16. 第一章 银联8583报文解析
  17. 教你如何用Python部署QQ频道机器人
  18. Python从入门到入土的90行代码
  19. Linux压缩备份相关命令
  20. php仅显示月份的日历,JSP_用JSP实现的一个日历程序,!-- 显示任意年、月的日历 - phpStudy...

热门文章

  1. 【音频处理】Adobe Audition 快捷键设置
  2. 【计算机网络】网络安全 : 实体鉴别 ( 实体鉴别过程 | 不重数机制 | 公钥体质加密不重数 | 中间人攻击 )
  3. 【计算机网络】网络安全 : 数据加密模型 ( 加密模型 | 密钥 | 密码学 | 密码安全 )
  4. 欢迎关注我的微信公众号 “我是一个假的程序猿”
  5. intelliJ idea 下载安装
  6. Motan的SPI机制实现分析
  7. 双击打开excel时提示:向程序发送命令时出现问题
  8. 《水晶报表自动补空行,补格线思路》 【转】
  9. Python写爬虫只需三步
  10. 输出值(4)输出值的应用