打印

我最后一个帖子:宏解析程序

[复制链接]
2060|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
IceAge|  楼主 | 2008-7-1 05:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   此程序为 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)
简简单单的就完成了任务,对于面向过程的迁入式设计,也可以借鉴这种思想,达到事半功倍的效果。

相关帖子

沙发
IceAge|  楼主 | 2008-7-1 05:33 | 只看该作者

项目文件在此


我以前发布的另一个范例:
http://www.adrive.com/public/38b9c9b56448fc59d40431ee9b34660deda3250cef1c0ed3f979670b2087134d.html

这个项目用于演示一个可扩展的驱动框架。
相关链接:http://www.adrive.com/public/919e7534a9ff68034e88dab62a99a3b5a018b3732ff2a19cf1ffef779510be8c.html

使用特权

评论回复
板凳
fsaok| | 2008-7-1 05:44 | 只看该作者

..

太深,不是很明白,做个记号

使用特权

评论回复
地板
IceAge|  楼主 | 2008-7-1 05:48 | 只看该作者

最后一次申明:

这个程序的代码没有抄任何人,那个键盘程序,也没有抄任何人,因为把技术做到我这种地步,已经用不着抄袭了。坦白的说:那个键盘程序是我信手写的,没有超过一分钟,目的只为展示 中断驱动+ 状态机 可以让设计多么简洁。关于 中断驱动+ 状态机, 我本想多介绍一些技巧,可惜不打断,以后到我的 blog 中看吧。

 

使用特权

评论回复
5
wxj1952| | 2008-7-1 09:38 | 只看该作者

没走啊。先告诉我们是哪个学校的研究生吧。

教授我诚恳地挽留您,至少回答完了你的键盘程序中的所有疑问再说走。要不可就理屈啦。

你信手写的?就是年纪大了没注意,把下面2条包含的基本概念忽略了,犯了本科生都不会犯的错误。
再仔细看看,修改一下要不了一分钟。改好了再走也有点风度。

void keyboard() { (*functions[state])();}

FUNTION_POINTER functions[] = { state0, state1, state2, ... stateN }; 

等我把所有分析都贴出来,再跟着我后面说什么这原因那理由?那算什么伎俩,我们都sh?周正龙过去可是凭一张嘴忽悠全世界的。什么境况下他都能安然脱身,总是有理。一个农民竟然以为中国的院士都比他sh? 这种人的致命要害就是低估了他人的能力。

“因为把技术做到我这种地步,已经用不着抄袭了。”教授又忘了,你技术都做到这么高的地步了,怎么连我那么简单的宏都没解出来呀?500元,吹牛要上税就不灵了。怎么aihe知道查互联网获得令牌环的信息,你怎么不行?

  哈,因为你不懂英文,看不懂英文网页,研究生英文可是要求6级。否则毕不了业。所以你不是研究生。“啊,我一时嘴漏。我收回.....的话”

使用特权

评论回复
6
forthlab| | 2008-7-1 10:00 | 只看该作者

wxj1952看你还挺年轻气盛的.

研究生英文要求6级,本科4级,这是后来的要求.我是本科就没有考过4级,我们毕业的时候还没有这种要求.

使用特权

评论回复
7
walle| | 2008-7-1 12:09 | 只看该作者

牛比烘烘的,米一点用处

使用特权

评论回复
8
zealane| | 2008-7-1 12:45 | 只看该作者

wxj1952,不要陷入自我的世界。

使用特权

评论回复
9
wxj1952| | 2008-7-1 15:10 | 只看该作者

6楼20年前就本科毕业了?英语不要求4级。

毕业20年了,值得敬重。记下了。

88年——20年以前就要求研究生英语6级了,IceAge是88年以前的研究生?那现在应该是研究员或者校长或者处长级别了。在这教咱们C?怎么连C函数使用之前要做的事情都不知道?
(哇!我又提醒他了,一分钟就写完了,过了4小时还没想起来哪写错了?)
没关系,还有的是疑问题呢。其它问题您答不上来可以说“业有专攻”。这次可是自己写的程序,总不能找原因说不知道吧。

“看不懂我的程序,只能怪你爹妈。”研究生即使失态也应该用英语开骂,也别太土太直接了。
 
例如:sling mud at others so as to boost oneself. 

使用特权

评论回复
10
一朝成名| | 2008-7-1 15:25 | 只看该作者

LS太强了,PF了

“研究生即使失态也应该用英语开骂,也别太土太直接了”

使用特权

评论回复
11
fsaok| | 2008-7-1 20:52 | 只看该作者

个人的看法

论坛的作用是讨论问题的,从而得到一些灵感和启发,

论坛的作用决不是拍砖,也不是为了背书。

使用特权

评论回复
12
zyqing333| | 2008-7-2 00:27 | 只看该作者

搞不懂现在的人都怎么了

地球很危险
21IC也很危险

使用特权

评论回复
13
huangqi412| | 2008-7-2 07:00 | 只看该作者

汗,,,,这气氛...

使用特权

评论回复
14
zyok| | 2008-7-2 09:15 | 只看该作者

LZ真走了?永远退出,最后一点贡献,最后一个帖子。。。

使用特权

评论回复
15
dongshan| | 2008-7-2 22:46 | 只看该作者

宏解析程序很好做的

学过编译原理的人,很快就能做出来。 
这个程序我用正则表达式很快就搞定。

使用特权

评论回复
16
hao01222| | 2008-7-13 13:04 | 只看该作者

诶,有点失望

诶,有点失望

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

325

帖子

4

粉丝