满分求文件分析算法,高手点击!

edward0716 2004-09-17 06:24:27
我的需求:
1.问题描述:
采用多线程机制,分析C/CPP头文件(.h),并以树型结构显示分析结果。
2.平台:
任何平台(建议MS-WINDOWS/UNIX OS)
3.编程平台:
支持OOP的编程工具(建议VC++)
4.编程语言:
C++语言

举例说明:
//a.cpp
#include "aa.h"
#include "bb.h"
#ifdef _SOME
# include <cc.h>
#else
# include <dd.h>
#endif
Some Code Follwing ...
......

//aa.h
#include "aa1.h"
#include <aa2.h>
...

//bb.h
#include ...
...

//cc.h
#include ...
...

//dd.h
#include ...
...

程序运行打开一C/CPP文件(如a.cpp),扫描文件提取文件中所包含的头文件(.h),并将主文件(a.cpp)中扫描的头文件作为一级树型列表,用其它线程同时扫

描已经提取的头文件,扫描是否含用头文件,如果有则作为当前文件的下一级树型列表,否则中止该线程。一直扫描到最后,但是要注意重复包含的情况。程序用

多线程的目的就是为了处理文件中含用多个头文件,用子线程完成其它头文件的扫描工作,这样在速度上比递归算法要快得多,效率也要高。如本例中通过多线程

扫描分析的结果:
▄a.cpp
▄aa.h
▄aa1.h
▄aa2.h
▄aa21.h
▄ ...
▄bb.h
▄bb1.h
▄bb11.h
▄ ...
▄cc.h
▄ ...
▄dd.h

(* ▄代表树型结点)
提示:在程序中可设三个链表:
a. 正在处理中的头文件表(该链表中存放所有工作线程处理的头文件名)
b. 没有处理的头文件表(该链表中存放线程待处理的头文件名)
c. 错误的头文件表(该链表中存放不存在的,或者出错的头文件名)

以上就是问题的描述,该问题综合性比较强,如果有不清题意或者有错误之处,请在本贴中贴出错误或者不明之处,您也可以致信:weilei0716@163.com。

大家可以发表自己对该问题的看法/思想/程序/,欢迎高手一起交流!
解决后相信这贴将是本BBS线程中的又一精贴。致谢各位!!!
...全文
143 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
edward0716 2004-09-28
用递归完成任务。
但有很多缺限!
回复
edward0716 2004-09-24
实现算法啊~
到现在还没有完成~郁闷咯~
只有一周就OVER了。
还是先顶起给你们解决了:)
回复
gloomyfish 2004-09-21
Hiei1234(飞影) 说的思路对
写出接受和非接受的state,把DFA变成程序就行了~~~~~~~~
应该不是很难的,只要有思路的话~~~
回复
OriesMap 2004-09-21
强人强帖。做个标记。

顶就一个字!
回复
edward0716 2004-09-20
出贴到现在,我首先感谢帮忙顶贴的同志,嘻~~~~
特别感谢:Hiei1234(飞影)、mfc168(子非鱼)两位朋友对问题的深入分析。
mfc168(子非鱼)说的问题是本问题中很重要的一点,确实要考虑到循环嵌套的情况,谢谢!
Hiei1234(飞影)的分析很精辟,想必你我编译原理一定“练”到第八层了吧,呵呵~,确实,在本问题中要考虑到词法分析一部分的内容,可是我的想法没有你的那么复杂,我的想法是:读每一头文件,然后按行处理,每行处理中包括三个方面:1、//行注释过滤。2、/**/多行注释过滤,这可能不在一行,为每一行做个FLAG,如果是/*多行注释FLAG为TRUE,一直扫描到*/结束,此时FLAG为FALSE,继续按行处理。3、条件编译中可能包含头文件。可能还有些不足,请指出,谢谢。这是我分析文件的整个思路,不知道有没有什么不妥?请高手指点一二。
回复
mfc168 2004-09-20
程序实现嘛,不难,不过很复杂,考虑的流程比较紧凑,思路要清晰,否则可能出错,感觉像一个编译器所完成的工作


你上面所说的,有一个错误:假设有一个头文件a.h 其中包含了a1.h 然后a1.h包含a2.h而在a2.h中,又包含了a.h 也就是说循环嵌套的问题,按照你上面的需求,出现这样的问题,结果一定是出现死循环!
我的解决方法:树形结构中,子节点中,不可以有自己的上级节点出现
回复
edward0716 2004-09-20
自己顶起~~
回复
Hiei1234 2004-09-20
实现请自己做,给你点提示:(若不理解请去看编译原理的书)
1、读取文件将数据传递给词法分析线程
2、建立文法分析线程:先统计出在包含各类关键字的各种类型和各种排列方法
然后分析词法(例如:<语句> -> '#'<#后面的语句>;
<#后面的语句> -><标识><标识后面的语句>;
<标识> -> include | define | ... ;
<标识后面的语句> -> <字母组合>|<NULL>;
...(略,请自己分析))
然后根据分析出的规则建立状态机(状态转换图)//这个是编程的关键
如果通过词法分析的(数据)放入没有处理的头文件表(这些数据包括头文件,或别的予处
理)。

3、当没有处理的头文件表中存在数据就启动语法分析并将分开的单词传递给语法语意分析线

(根据FIRST和FOLLOW集建立程序,自顶向下还是自底向上就随你了)
在这个线程中过滤掉预处理和不必要的头文件
例如:(#ifdef _SOME
#include <cc.h>在这个之后没有#define _SOME的出现)

4、最后就是输出了

注释:
在每一部分析和过滤中输出错误的项,这样我认为那个出错列表可以不要。
其他的就只要注意线程的并发




回复
nwpulipeng 2004-09-20
混点分
回复
nwpulipeng 2004-09-20
顶!混分
回复
jetfire_wine 2004-09-20
帮顶
回复
cngonet 2004-09-20
哎,帮一把
回复
edward0716 2004-09-19
晕~
再顶~
回复
edward0716 2004-09-19
快沉了~~
高手快来顶起,谢谢!
回复
edward0716 2004-09-18
顶起来
一天了,还没有高手来解决吗? :)
回复
syy64 2004-09-18
ding
回复
发动态
发帖子
图形处理/算法
创建于2007-09-28

1.9w+

社区成员

VC/MFC 图形处理/算法
申请成为版主
社区公告
暂无公告