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

简介:

一、程序的基本结构




 

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

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

     TypeDictionary(Root)
         
|-- TypeDictionary
         
|         |-- TypeDictionary
         
|         |-- TypeDictionary
         
|         |
         
|         |-- Type
         
|         |-- Type
         
|         |
         
|
         
|-- TypeDictionary
         
|
         
|-- Type
         
|-- Type
         
|

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

·AliasCmds ,命令缩写字典。

·Instances,用户变量字典。

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

             while  ((cmd  =  Console.ReadLine().Trim())  !=   " exit " )
            
{
                
if (!String.IsNullOrEmpty(cmd))
                
{
                    cxt.Invoke(cmd);
                }

                Console.Write(
">> ");
            }

 

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

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

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

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

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

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

CmdDispatcher.Dispatch()方法代码:

 

         public   void  Dispatch()
        
{
            String[] results 
= InputCmdString.Split(SPLITS, StringSplitOptions.None);
            
if(results.Length == 0return;

            String cmd 
= results[0];
            String mark 
= String.Empty;
            IList
<String> args = new List<String>();

            Int32 argIndex 
= 1;

            
if (results.Length > 1 && results[1].StartsWith("-"))
            
{
                argIndex 
++;
                mark 
= results[1];
            }


            
for(;argIndex < results.Length;argIndex++)
            
{
                args.Add(results[argIndex]);
            }


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

                            }


                            Context.Invoke(fullCmd);
                        }

                        
else                   // 编译代码并运行
                        {
                            
new CscCmdHandler(Context, InputCmdString).Run();
                        }

                        
break;
                }


            
return;
        }

本文转自xiaotie博客园博客,原文链接http://www.cnblogs.com/xiaotie/archive/2008/02/29/1085815.html如需转载请自行联系原作者

xiaotie 集异璧实验室(GEBLAB)
相关文章
|
Prometheus 运维 监控
linux磁盘I/O监控
【4月更文挑战第1天】在Linux中监控磁盘I/O性能至关重要,工具如iostat(-d显示磁盘统计)、iotop(进程级I/O查看)、vmstat、/proc/diskstats(详细统计信息)、Node Exporter(Prometheus集成)和Zabbix(动态监控与LLD)提供关键指标,如IOPS、吞吐量、利用率和服务时间,助力系统优化和故障排查。
822 4
linux磁盘I/O监控
|
网络安全 数据安全/隐私保护
为什么免费证书的有效期为90天
为什么免费证书的有效期为90天
1809 0
|
传感器 供应链 安全
IIoT 与 IoT:详细比较
【8月更文挑战第23天】
1303 4
|
安全 API 开发工具
Android14 适配之——targetSdkVersion 升级到 34 需要注意些什么?(下)
Android14 适配之——targetSdkVersion 升级到 34 需要注意些什么?(下)
2412 0
|
消息中间件 监控 Java
解锁Spring Cloud微服务架构的奥秘:深度剖析拆分原则,打造高内聚低耦合的业务创新引擎!
【8月更文挑战第3天】踏入微服务领域,Spring Cloud以丰富组件助力高效系统构建。微服务拆分需遵循原则确保系统高内聚低耦合且能适应变化。首要原则为单一职责,每个服务专注一个业务功能,降低复杂度并提高可维护性。其次,追求高内聚低耦合以减少服务间影响。围绕业务域拆分有助于保持逻辑清晰及团队协作。处理数据一致性问题时,考虑采用最终一致性模型。Spring Cloud提供Eureka、Zuul/Gateway、Sleuth和Config等工具支持服务发现、路由、跟踪及配置管理,共同构建灵活健壮的微服务架构。
551 2
|
网络协议 搜索推荐 网络安全
域名与子域名挖掘概述
域名与子域名挖掘概述
874 1
|
机器学习/深度学习 人工智能 自然语言处理
数据标注是AI认识世界的起点
数据标注是AI认识世界的起点
1001 2
数据标注是AI认识世界的起点
|
C语言 Python
加速 Python for 循环的12个操作
加速 Python for 循环的12个操作
385 0
|
SQL 自然语言处理 JavaScript
快来与 CodeQwen1.5 结对编程
今天,来自 Qwen1.5 开源家族的新成员,代码专家模型 CodeQwen1.5开源!CodeQwen1.5 基于 Qwen 语言模型初始化,拥有 7B 参数的模型,其拥有 GQA 架构,经过了 ~3T tokens 代码相关的数据进行预训练,共计支持 92 种编程语言、且最长支持 64K 的上下文输入。效果方面,CodeQwen1.5 展现出了优秀的代码生成、长序列建模、代码修改、SQL 能力等,该模型可以大大提高开发人员的工作效率,并在不同的技术环境中简化软件开发工作流程。
|
存储 Linux 时序数据库
CentOS7安装InfluxDB
CentOS7安装InfluxDB
495 1