实现简单的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)
相关文章
|
存储 弹性计算 运维
阿里巴巴云原生 etcd 服务集群管控优化实践
这些年,阿里云原生 etcd 服务发生了翻天覆地的变化,这篇文章主要分享一下 etcd 服务在面对业务量大规模增长下遇到的问题以及我们是如何解决的,希望对读者了解 etcd 的使用和管控运维提供经验分享。
阿里巴巴云原生 etcd 服务集群管控优化实践
|
7月前
|
JSON 供应链 监控
1688品类API:热门行业榜单,选品指南!
本文介绍如何利用1688品类API获取热门行业榜单数据,结合选品指南实现数据驱动的电商选品。涵盖API基础、Python调用示例、趋势分析、产品筛选与风险控制,助力企业高效优化供应链,提升市场竞争力。(238字)
|
4月前
|
Linux API 网络安全
零基础一站式OpenClaw部署:阿里云轻量服务器/MacOS/Linux/Windows11搭建+千问大模型API配置与问题排查
2026年,OpenClaw(原Clawdbot)凭借轻量化、跨平台、可扩展的特性,成为个人与团队搭建本地AI助手的主流框架。本文严格按照2026年最新流程,完整覆盖阿里云轻量服务器部署、本地MacOS/Linux/Windows11部署OpenClaw、阿里云千问Qwen3.6-Plus API配置、免费Coding Plan API配置以及高频问题解答,所有命令可直接复制运行,全程无冗余操作,新手也能一次部署成功。
534 0
|
7月前
|
人工智能 监控 架构师
工程师思维看透人心?这个“集成框架”可能颠覆了个人成长领域
《内生力量智慧集成系统》是一套专为技术人设计的“自我认知操作系统”,以系统工程思维重构个人成长:用“七力光谱”扫描内在配置,以“阻滞系数”“一致性指数”等指标动态诊断,支持从调优(1.0–2.0)到重构(3.0)、集成(4.0)乃至超越工具(5.0)的全周期演进。它不贴标签,只提供可测量、可干预、可迭代的元认知框架,助你在AI时代成为自身意识系统的架构师。(239字)
802 7
|
人工智能 前端开发 数据可视化
不再乱改接口、不再反复调试:接口联调跟踪工具带来流程级效率提升
项目上线前,接口联调常因信息不透明、文档混乱、沟通低效等问题频频翻车,导致进度延误、反复返工。本文详解接口联调的核心问题、协作角色、管理流程与工具推荐,助你建立高效联调体系,提升团队协作效率,实现接口状态可追踪、变更有记录、责任有归属,让接口联调不再成为交付瓶颈。
|
网络安全 开发工具 数据安全/隐私保护
git远程操控gitee
本文介绍了如何配置SSH公钥以实现Git的SSH远程登录Gitee,包括生成SSH密钥对、将公钥添加至Gitee账户、克隆仓库、同步本地更改至Gitee、删除远程文件以及查看和管理远程仓库的操作步骤。
441 5
|
安全 Python
详解module ‘yaml‘ has no attribute ‘FullLoader‘
遇到“module 'yaml' has no attribute 'FullLoader'”错误时,首先应该确认你正在使用的PyYAML库的版本至少是5.1,并确保已经正确地导入了PyYAML。紧随其后,考虑使用 `safe_load()`作为读取YAML文件的更安全方式。通过采取这些解决措施,你应该能够有效地解决这个问题,使你的代码能够顺利地读取YAML文件。
635 2
|
编解码 芯片 内存技术
正点原子DS100拆解全过程-硬件工程师必备
正点原子DS100拆解全过程-硬件工程师必备
1626 0
正点原子DS100拆解全过程-硬件工程师必备
|
SQL 设计模式 消息中间件
接口设计需要考虑的问题
接口设计需要注意的问题
2399 0
接口设计需要考虑的问题
|
缓存 负载均衡 网络协议
CDN的基本原理和基础架构
本文为大家介绍CDN的基本工作原理、关键组件、基础架构和部署架构
27919 0

热门文章

最新文章