此程序为 Visual C++ 2005 mfc 项目,没有抄别人的一行代码。功能很简单:解析文件中的macro, 并替换。由于使用了集合,宏数量没有限制,参数没有限制。此程序贯彻的OOD 的设计思想,高度可扩展,可以轻易的加入关键字。目前支持的关键字有 4 个:macro, endm, repeat, endr。
宏文件示意如下: m1 macro a1, a2, a3 a1 repeat a2 nop nop endr endm
m2 macro a1, a2, a3 a2 repeat a3 test endr endm
m1 2, 3, 4 test1 m2 5, 6, 7 test2
项目文件说明: o Macro, MacroDlg: 由VC++ 生成。 o Collection: 集合类, 由 hashtable + Array 组成,通过名称或索引存取。 o Element: 宏元素, 内含Celement 集合, 形成了Element 树状结构。 o MacroManager:解析与执行宏。
CElement* pKeyword = m_Element.elements.GetAt(p); if (pKeyword != NULL) { bRun = pKeyword->Run(parser, &m_Element, i); 从宏集合 (m_Element.elements) 中查找关键词,找出相应的对象(CElementMacro, CRecorder 等)运行。
o ElementMacro : 宏处理类,将生成一个 CRecorder,并添加到MacroManager. m_Element.elements 中。同时解析 repeat. 这里仅仅加入了两个关键字
elements.Add("repeat", new CElementRepeat()); elements.Add("endm", new CElement());
加入其他宏命令,并从CElement 导出相应的处理,就可完成扩展。
o ElementRepeat :repeat 关键字的处理。 o Cell : 基本宏指令存储单元,允许宏参数替换。 o Recorder: 记录器,保存宏参数,宏指令。 o Parser :文本解析。 o IO: 输入输出,这里使用的输入输出是都是文件。
从这个程序上可以看到,c++ 设计思路与面向过程c 程序的极大不同. ood 难点在于搭建框架, 一旦建立框架,每个对象各司其职,通过 Run(CParser& parser, CElement* pElement, int position) 简简单单的就完成了任务,对于面向过程的迁入式设计,也可以借鉴这种思想,达到事半功倍的效果。
|