我的需求:
    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. 错误的头文件表(该链表中存放不存在的,或者出错的头文件名)以上就是问题的描述,该问题综合性比较强,如果有不清题意或者有错误之处,请在本贴中贴出错误或者不明之处,您也可以致信:[email protected]。大家可以发表自己对该问题的看法/思想/程序/,欢迎高手一起交流!
解决后相信这贴将是本BBS线程中的又一精贴。致谢各位!!!

解决方案 »

  1.   

    实现请自己做,给你点提示:(若不理解请去看编译原理的书)
    1、读取文件将数据传递给词法分析线程
    2、建立文法分析线程:先统计出在包含各类关键字的各种类型和各种排列方法
       然后分析词法(例如:<语句> -> '#'<#后面的语句>; 
                        <#后面的语句> -><标识><标识后面的语句>;
                        <标识> -> include | define | ... ;
                       <标识后面的语句> -> <字母组合>|<NULL>;
                        ...(略,请自己分析))
       然后根据分析出的规则建立状态机(状态转换图)//这个是编程的关键
       如果通过词法分析的(数据)放入没有处理的头文件表(这些数据包括头文件,或别的予处
       理)。3、当没有处理的头文件表中存在数据就启动语法分析并将分开的单词传递给语法语意分析线
       程
       (根据FIRST和FOLLOW集建立程序,自顶向下还是自底向上就随你了)
       在这个线程中过滤掉预处理和不必要的头文件
       例如:(#ifdef _SOME
                 #include <cc.h>在这个之后没有#define _SOME的出现)4、最后就是输出了注释:
        在每一部分析和过滤中输出错误的项,这样我认为那个出错列表可以不要。
        其他的就只要注意线程的并发   
        
      

  2.   

    程序实现嘛,不难,不过很复杂,考虑的流程比较紧凑,思路要清晰,否则可能出错,感觉像一个编译器所完成的工作
    你上面所说的,有一个错误:假设有一个头文件a.h  其中包含了a1.h 然后a1.h包含a2.h而在a2.h中,又包含了a.h    也就是说循环嵌套的问题,按照你上面的需求,出现这样的问题,结果一定是出现死循环!
    我的解决方法:树形结构中,子节点中,不可以有自己的上级节点出现
      

  3.   

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

  4.   

    Hiei1234(飞影) 说的思路对
       写出接受和非接受的state,把DFA变成程序就行了~~~~~~~~
      应该不是很难的,只要有思路的话~~~