纯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 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)相关推荐
- 在windows程序中嵌入Lua脚本引擎--编写自己的Lua库
在<在windows程序中嵌入Lua脚本引擎--建立一个简易的"云命令"执行的系统>一文中,我提到了使用Lua的ffi库,可以让我们像写C代码一样写lua程序.这是个非 ...
- 【网络攻防课实验】五:Nmap脚本引擎 (NSE) 的使用及脚本编写
文章目录 实验简述 实验环境 实验内容 1.初识NSE 2.NSE参数 3.输出细节 4.脚本格式 5.编写脚本 实验总结 实验简述 Nmap具有强大的脚本引擎NSE(Nmap Scripting E ...
- autojs免root脚本引擎编写的QQ空间点赞脚本源码
说明 本文提供的代码仅供参考.不建议用于生产环境. 可能有些地方在最新版本的Auto.js上面需要做修改,才能运行. Auto.js简介 Auto.js是利用安卓系统的"辅助功能" ...
- autojs Pro免root脚本引擎编写的获取本地时间及网络时间验证
说明 本文提供的代码仅供参考.不建议用于生产环境. 可能有些地方在最新版本的Auto.js上面需要做修改,才能运行. Auto.js简介 Auto.js是利用安卓系统的"辅助功能" ...
- autojs免root脚本引擎编写的本地音乐播放器源代码开源
说明 本文提供的代码仅供参考.不建议用于生产环境. 可能有些地方在最新版本的Auto.js上面需要做修改,才能运行. Auto.js简介 Auto.js是利用安卓系统的"辅助功能" ...
- 基于autojs的安卓免root脚本引擎编写的QQ文字换语言发送全自动脚本
说明 本文提供的代码仅供参考.不建议用于生产环境. 可能有些地方在最新版本的Auto.js上面需要做修改,才能运行. Auto.js简介 Auto.js是利用安卓系统的"辅助功能" ...
- autojs脚本引擎编写的百度网盘BDUSS获取代码
说明 本文提供的代码仅供参考.不建议用于生产环境. 可能有些地方在最新版本的Auto.js上面需要做修改,才能运行. Auto.js简介 Auto.js是利用安卓系统的"辅助功能" ...
- Java版AVG游戏开发入门示例 3 ——脚本引擎的制作及应用
源码下载地址:http://code.google.com/p/loon-simple/downloads/list 根据wikipedia的解释:脚本语言(Script language,scrip ...
- Java版AVG游戏开发入门示例[3]——脚本引擎的制作及应用
源码下载地址:http://code.google.com/p/loon-simple/downloads/list 根据wikipedia的解释:脚本语言(Script language,scrip ...
最新文章
- SAP COR2下达工单,报错 System status APNG is active 之对策
- Struts2 入门修行第一天 | 小节二
- mini CentOS7 安装 mysql
- error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏的解决方案
- 春天:注入列表,地图,可选对象和getBeansOfType()陷阱
- java学习(9):巩固练习
- 阿里云高校“在家实践”计划,免费提供2.68亿小时算力!
- ftp ---- 配置文件(默认配置文件解读)
- 4-1 ADO.NET简介 4
- toolchain安装教程支持_网上现成toolchain安装操作
- 数据库时间慢了14个小时,Mybatis说,这个锅我不背~
- python 把矩阵变成一维_python矩阵转换为一维数组的实例
- 加州房价预测项目详细笔记(Regression)——(3)准备数据(数据的预处理)
- 成功安装python后、在dos命令行窗口中-python在WIN运行时去掉DOS窗口显示的方法
- 为什么计算机播放音乐不响,电脑打开音响,播放音乐为什么没有声音??!!~急急急!!快! 爱问知识人...
- 第一章 银联8583报文解析
- 教你如何用Python部署QQ频道机器人
- Python从入门到入土的90行代码
- Linux压缩备份相关命令
- php仅显示月份的日历,JSP_用JSP实现的一个日历程序,!-- 显示任意年、月的日历 - phpStudy...
热门文章
- 【音频处理】Adobe Audition 快捷键设置
- 【计算机网络】网络安全 : 实体鉴别 ( 实体鉴别过程 | 不重数机制 | 公钥体质加密不重数 | 中间人攻击 )
- 【计算机网络】网络安全 : 数据加密模型 ( 加密模型 | 密钥 | 密码学 | 密码安全 )
- 欢迎关注我的微信公众号 “我是一个假的程序猿”
- intelliJ idea 下载安装
- Motan的SPI机制实现分析
- 双击打开excel时提示:向程序发送命令时出现问题
- 《水晶报表自动补空行,补格线思路》 【转】
- Python写爬虫只需三步
- 输出值(4)输出值的应用