一、程序的基本结构


实现简单的CSharpShell -- OrcShell (1) 基本结构

 

程序的控制核心是Context类,它持有:

·类型管理器TypeManager,管理该运用程序域加载的命名空间及类型的树,树结构如下:

实现简单的CSharpShell -- OrcShell (1) 基本结构     TypeDictionary(Root)
实现简单的CSharpShell -- OrcShell (1) 基本结构         
|--TypeDictionary
实现简单的CSharpShell -- OrcShell (1) 基本结构         
|       |--TypeDictionary
实现简单的CSharpShell -- OrcShell (1) 基本结构         
|       |--TypeDictionary
实现简单的CSharpShell -- OrcShell (1) 基本结构         
|       |实现简单的CSharpShell -- OrcShell (1) 基本结构实现简单的CSharpShell -- OrcShell (1) 基本结构
实现简单的CSharpShell -- OrcShell (1) 基本结构         
|       |--Type
实现简单的CSharpShell -- OrcShell (1) 基本结构         
|       |--Type
实现简单的CSharpShell -- OrcShell (1) 基本结构         
|       |实现简单的CSharpShell -- OrcShell (1) 基本结构实现简单的CSharpShell -- OrcShell (1) 基本结构
实现简单的CSharpShell -- OrcShell (1) 基本结构         
|
实现简单的CSharpShell -- OrcShell (1) 基本结构         
|--TypeDictionary
实现简单的CSharpShell -- OrcShell (1) 基本结构         
|实现简单的CSharpShell -- OrcShell (1) 基本结构实现简单的CSharpShell -- OrcShell (1) 基本结构
实现简单的CSharpShell -- OrcShell (1) 基本结构         
|--Type
实现简单的CSharpShell -- OrcShell (1) 基本结构         
|--Type
实现简单的CSharpShell -- OrcShell (1) 基本结构         
|实现简单的CSharpShell -- OrcShell (1) 基本结构实现简单的CSharpShell -- OrcShell (1) 基本结构
实现简单的CSharpShell -- OrcShell (1) 基本结构

其中TypeDictionary对应的是命名空间,Type对应的是类型。TypeManager还管理一个名为NowTypeDictionary,表示当前所在的TypeDictionary

·AliasCmds ,命令缩写字典。

·Instances,用户变量字典。

·CmdDispatcher是命令指派器。控制台获取指令后传给Context。代码:

实现简单的CSharpShell -- OrcShell (1) 基本结构            while ((cmd = Console.ReadLine().Trim()) != "exit")
实现简单的CSharpShell -- OrcShell (1) 基本结构            
{
实现简单的CSharpShell -- OrcShell (1) 基本结构                
if (!String.IsNullOrEmpty(cmd))
实现简单的CSharpShell -- OrcShell (1) 基本结构                
{
实现简单的CSharpShell -- OrcShell (1) 基本结构                    cxt.Invoke(cmd);
实现简单的CSharpShell -- OrcShell (1) 基本结构                }

实现简单的CSharpShell -- OrcShell (1) 基本结构                Console.Write(
">> ");
实现简单的CSharpShell -- OrcShell (1) 基本结构            }

实现简单的CSharpShell -- OrcShell (1) 基本结构

 

Context又传给CmdDispatcher处理。CmdDispatcher解析命令,根据命令的特征选择不同的CmdHandler来处理。目前编写了5CmdDispatcher

CdClassCmdHandler:进出命名空间的处理,针对cdc指令;

ListClassCmdHandler:列出命名空间和类型,针对lsc,dirc指令;

ListInstanceCmdHandler:列出用户变量,针对 my 指令;

ListAliasCmdHandler:列出指令缩写,针对 alias 指令;

CscCmdHandler:编译并运行代码,其它CmdDispatcher 处理不了的都交给它。

CmdDispatcher.Dispatch()方法代码:

 

实现简单的CSharpShell -- OrcShell (1) 基本结构        public void Dispatch()
实现简单的CSharpShell -- OrcShell (1) 基本结构        
{
实现简单的CSharpShell -- OrcShell (1) 基本结构            String[] results 
= InputCmdString.Split(SPLITS, StringSplitOptions.None);
实现简单的CSharpShell -- OrcShell (1) 基本结构            
if(results.Length == 0return;
实现简单的CSharpShell -- OrcShell (1) 基本结构
实现简单的CSharpShell -- OrcShell (1) 基本结构            String cmd 
= results[0];
实现简单的CSharpShell -- OrcShell (1) 基本结构            String mark 
= String.Empty;
实现简单的CSharpShell -- OrcShell (1) 基本结构            IList
<String> args = new List<String>();
实现简单的CSharpShell -- OrcShell (1) 基本结构
实现简单的CSharpShell -- OrcShell (1) 基本结构            Int32 argIndex 
= 1;
实现简单的CSharpShell -- OrcShell (1) 基本结构
实现简单的CSharpShell -- OrcShell (1) 基本结构            
if (results.Length > 1 && results[1].StartsWith("-"))
实现简单的CSharpShell -- OrcShell (1) 基本结构            
{
实现简单的CSharpShell -- OrcShell (1) 基本结构                argIndex 
++;
实现简单的CSharpShell -- OrcShell (1) 基本结构                mark 
= results[1];
实现简单的CSharpShell -- OrcShell (1) 基本结构            }

实现简单的CSharpShell -- OrcShell (1) 基本结构
实现简单的CSharpShell -- OrcShell (1) 基本结构            
for(;argIndex < results.Length;argIndex++)
实现简单的CSharpShell -- OrcShell (1) 基本结构            
{
实现简单的CSharpShell -- OrcShell (1) 基本结构                args.Add(results[argIndex]);
实现简单的CSharpShell -- OrcShell (1) 基本结构            }

实现简单的CSharpShell -- OrcShell (1) 基本结构
实现简单的CSharpShell -- OrcShell (1) 基本结构            
switch (cmd.ToLower())
实现简单的CSharpShell -- OrcShell (1) 基本结构                
{
实现简单的CSharpShell -- OrcShell (1) 基本结构                    
case "debug":   // 开启debug开关
实现简单的CSharpShell -- OrcShell (1) 基本结构
                        Context.Debug = true;
实现简单的CSharpShell -- OrcShell (1) 基本结构                        
break;
实现简单的CSharpShell -- OrcShell (1) 基本结构                    
case "undebug"// 关闭debug开关
实现简单的CSharpShell -- OrcShell (1) 基本结构
                        Context.Debug = false;
实现简单的CSharpShell -- OrcShell (1) 基本结构                        
break;
实现简单的CSharpShell -- OrcShell (1) 基本结构                    
case "cdc":     // 改变命名空间
实现简单的CSharpShell -- OrcShell (1) 基本结构
                        new CdClassCmdHandler(Context, InputCmdString, mark, args).Run();
实现简单的CSharpShell -- OrcShell (1) 基本结构                        
break;
实现简单的CSharpShell -- OrcShell (1) 基本结构                    
case "lsc":     // 列出命名空间的内容
实现简单的CSharpShell -- OrcShell (1) 基本结构
                    case "dirc":
实现简单的CSharpShell -- OrcShell (1) 基本结构                        
new ListClassCmdHandler(Context, InputCmdString, mark, args).Run();
实现简单的CSharpShell -- OrcShell (1) 基本结构                        
break;
实现简单的CSharpShell -- OrcShell (1) 基本结构                    
case "my":      // 列出用户变量
实现简单的CSharpShell -- OrcShell (1) 基本结构
                        new ListInstanceCmdHandler(Context, InputCmdString, mark, args).Run();
实现简单的CSharpShell -- OrcShell (1) 基本结构                        
break;
实现简单的CSharpShell -- OrcShell (1) 基本结构                    
case "alias":   // 列出alias列表
实现简单的CSharpShell -- OrcShell (1) 基本结构
                        new ListAliasCmdHandler(Context, InputCmdString, mark, args).Run();
实现简单的CSharpShell -- OrcShell (1) 基本结构                        
break;
实现简单的CSharpShell -- OrcShell (1) 基本结构                    
default:
实现简单的CSharpShell -- OrcShell (1) 基本结构                        String fullCmd 
= Context.GetFullCmd(cmd);
实现简单的CSharpShell -- OrcShell (1) 基本结构                        
if (fullCmd != null)    // 处理 alias
实现简单的CSharpShell -- OrcShell (1) 基本结构
                        {
实现简单的CSharpShell -- OrcShell (1) 基本结构                            
if (mark != null) fullCmd += " " + mark;
实现简单的CSharpShell -- OrcShell (1) 基本结构                            
if (args != null && args.Count > 0)
实现简单的CSharpShell -- OrcShell (1) 基本结构                            
{
实现简单的CSharpShell -- OrcShell (1) 基本结构                                
foreach(String s in args)
实现简单的CSharpShell -- OrcShell (1) 基本结构                                
{
实现简单的CSharpShell -- OrcShell (1) 基本结构                                    fullCmd 
+= " " + s;
实现简单的CSharpShell -- OrcShell (1) 基本结构                                }

实现简单的CSharpShell -- OrcShell (1) 基本结构                            }

实现简单的CSharpShell -- OrcShell (1) 基本结构
实现简单的CSharpShell -- OrcShell (1) 基本结构                            Context.Invoke(fullCmd);
实现简单的CSharpShell -- OrcShell (1) 基本结构                        }

实现简单的CSharpShell -- OrcShell (1) 基本结构                        
else                   // 编译代码并运行
实现简单的CSharpShell -- OrcShell (1) 基本结构
                        {
实现简单的CSharpShell -- OrcShell (1) 基本结构                            
new CscCmdHandler(Context, InputCmdString).Run();
实现简单的CSharpShell -- OrcShell (1) 基本结构                        }

实现简单的CSharpShell -- OrcShell (1) 基本结构                        
break;
实现简单的CSharpShell -- OrcShell (1) 基本结构                }

实现简单的CSharpShell -- OrcShell (1) 基本结构
实现简单的CSharpShell -- OrcShell (1) 基本结构            
return;
实现简单的CSharpShell -- OrcShell (1) 基本结构        }

实现简单的CSharpShell -- OrcShell (1) 基本结构
本文转自xiaotie博客园博客,原文链接http://www.cnblogs.com/xiaotie/archive/2008/02/29/1085815.html如需转载请自行联系原作者

xiaotie 集异璧实验室(GEBLAB)

相关文章:

  • 2021-11-09
  • 2021-07-10
  • 2021-09-23
  • 2021-06-02
  • 2021-05-31
  • 2021-10-02
  • 2021-05-20
  • 2021-06-26
猜你喜欢
  • 2022-03-04
  • 2022-02-25
  • 2021-07-02
  • 2022-12-23
  • 2022-12-23
  • 2021-09-07
  • 2021-12-18
相关资源
相似解决方案