总算基本完成脚本平台 for C#2.0

刚刚才用上C#2.0,原来是这么好用啊,迫不及待的想用熟它;

最近想到平台的体系,认为自己的脚本解释器是必不可少的,于是自己抄刀;花了将近一个星期,总算建设了一个有点象样的框架了。

基本设计:
1、基于C#2.0开发
2、通过反射动态调用LIB的方法
3、完全手写的SCRIPT解释器,不用.NET的编译器做脚本解释器(完全按行模式执行)
4、提供一个基础的控制台程序(SHELL),支持批处理模式反射调用方法
5、提供DEBUG模式的SCRIPT IDE,用于简单调试(目前解释器还有点小BUG,DEBUG功能目前还未完善)

以下是SHELL的外观图:
总算基本完成脚本平台 for C#2.0

完全模拟DOS的命令行,所有指令为反射调用的LIB方法;通过全局的配置读入:
Environment.xml配置用于存放LIB的相关信息

 1 <? xml version="1.0" encoding="utf-8" ?>
 2 < ModuleInfoConfig  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd ="http://www.w3.org/2001/XMLSchema"  xmlns ="http://www.csit.com.cn" >
 3    < ModuleInfo >
 4      < ModuleName > C:\Documents and Settings\Administrator\桌面\MyShell\MyShell\Lib\CSIT.StdLib.dll </ ModuleName >
 5      < NameSpace > CSIT.StdLib </ NameSpace >
 6      < MainClassName > StdLibClass </ MainClassName >
 7      < Key > STD </ Key >
 8    </ ModuleInfo >
 9    < ModuleInfo >
10      < ModuleName > C:\Documents and Settings\Administrator\桌面\MyShell\MyShell\Lib\CSIT.WinForms.dll </ ModuleName >
11      < NameSpace > CSIT.WinForms </ NameSpace >
12      < MainClassName > Msg </ MainClassName >
13      < Key > MSG </ Key >
14    </ ModuleInfo >
15 </ ModuleInfoConfig >

Command.xml用于存放所有指令的描述信息
<? xml version="1.0" encoding="utf-8" ?>
< ModuleCommandConfig  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd ="http://www.w3.org/2001/XMLSchema"  xmlns ="http://www.csit.com.cn" >
  
< CommandConfig >
    
< CommandName > Cls </ CommandName >
    
< Description > 清除屏幕 </ Description >
    
< CallMethodName > Cls </ CallMethodName >
    
< ReturnType > void </ ReturnType >
    
< ParamsList  />
    
< Key > STD </ Key >
  
</ CommandConfig >
  
< CommandConfig >
    
< CommandName > Print </ CommandName >
    
< Description > 输出字符串 </ Description >
    
< CallMethodName > Print </ CallMethodName >
    
< ReturnType > void </ ReturnType >
    
< ParamsList > string </ ParamsList >
    
< Key > STD </ Key >
  
</ CommandConfig >
  
< CommandConfig >
    
< CommandName > ShellExecute </ CommandName >
    
< Description > 执行程序 </ Description >
    
< CallMethodName > ShellExecute </ CallMethodName >
    
< ReturnType > void </ ReturnType >
    
< ParamsList > string </ ParamsList >
    
< Key > STD </ Key >
  
</ CommandConfig >
  
< CommandConfig >
    
< CommandName > = </ CommandName >
    
< Description > 表达式计算 </ Description >
    
< CallMethodName > Eval </ CallMethodName >
    
< ReturnType > void </ ReturnType >
    
< ParamsList > string </ ParamsList >
    
< Key > STD </ Key >
  
</ CommandConfig >
  
< CommandConfig >
    
< CommandName > Dir </ CommandName >
    
< Description > 目录 </ Description >
    
< CallMethodName > Dir </ CallMethodName >
    
< ReturnType > void </ ReturnType >
    
< ParamsList > string </ ParamsList >
    
< Key > STD </ Key >
  
</ CommandConfig >
  
< CommandConfig >
    
< CommandName > CD </ CommandName >
    
< Description > 更改目录 </ Description >
    
< CallMethodName > CD </ CallMethodName >
    
< ReturnType > void </ ReturnType >
    
< ParamsList > string </ ParamsList >
    
< Key > STD </ Key >
  
</ CommandConfig >
  
< CommandConfig >
    
< CommandName > MsgBox </ CommandName >
    
< Description > 消息对话框 </ Description >
    
< CallMethodName > MsgBox </ CallMethodName >
    
< ReturnType > void </ ReturnType >
    
< ParamsList > string </ ParamsList >
    
< Key > MSG </ Key >
  
</ CommandConfig >
</ ModuleCommandConfig >

以上两个配置文件全部通过序列化方式生成,期间还设计到一个指令生成器;(该部分由同事完成)将DLL文件装入后自动建立这些配置信息,命令部分只获取PUBLIC方法。

批处理的调用:
BATCH FROM FILE=C:\Test.cmd
cls
print 开始测试批处理!
msgbox 这个是文本对话框
ShellExecute notepad
print 已经启动了写字板了吗?
print 开始测试表达式!
print 
1 + 2 + 3 + 4 = ?
=   1 + 2 + 3 + 4
print 
1 * 99 = ?
=   1 * 99
print 列表目录的指令为 dir
print 切换目录的指令为 cd

print 结束执行

脚本的调用:
script=c:\Math Board.ssf
begin
    NewLine 
=  Chr( 13 ) & Chr( 10
    N 
=   9
    for (i
, 0 , 10 , 1 )
        S 
=  S & N &  "  x  "  & i &  "  =  "  & (N * i) & NewLine
    next
    call ShowMsg(S
, " Math Board Of  "  & N)
end

脚本调试器的调用
script debug
总算基本完成脚本平台 for C#2.0

脚本的语法定义:
begin
   statement;
   statement;
end
statement
=   条件语句
if  (cond)
  statement
else
  statement
endif 

或者

if  (cond)
 statement
endif 

statment
=   For语句

for  (val,开始值,结束值,增量值)

    statement;
    statement;
next

statement
=  While语句

while  (条件)
  statment;
  statment;
next

statement
= call语句

calll func par,par,par




你可能感兴趣的:(for)