python之自动生成C++的父子双向继承关系
2015-11-19 00:00
260 查看
## toClass.py
@@用法说明
C++源码放置于脚本同级目录,然后执行如下脚本
toClass.py > index.html
import os,sys,re import shutil,string #[OK] class CObject(object): def __init__(self,name,href): self._name = name self._href = href self._children = [] self._parent = None def setHref(self,href): self._href = href def setParent(self,parent): self._parent = parent def addChild(self,child): self._children.append(child) def childCount(self): return len(self._children) def parent(self): return self._parent def children(self): return self._children def toAnchor(self): anchor_str = r'<a href="%s" style="border:1px black solid;color:red;font-weight:bold;">%s</a>' % (self._href,self._name) bgColor = "gray" color = "red" link = "#" if len(self._children) > 0: bgColor = "red" color = "blue" link = "child/%s.html" % (self._name) c_str = r'<a href="%s" style="margin-left:-8;background:%s;border:1px black solid;color:%s;font-weight:bold;">%s</a>' % (link,bgColor,color,'-') return "%s\n%s" % (anchor_str,c_str) def flushChild(self): fname = r'%s/child/%s.html' % (os.getcwd(),self._name) ret = "" for ch in self._children: ch_str = r'<div style="border:1px black solid;color:red;font-weight:bold;">%s</div>' % (ch) ret = "%s%s%s" % (ret,ch_str,"<hr>") with open(fname,'w') as f: f.write(ret) def name(self): return self._name def href(self): return self._href #[OK] gCount = 0 def getList(dirname,pFunc): global gCount try: ls=os.listdir(dirname) except: print dirname,'is access deny' else: for file in ls: temp = os.path.join(dirname,file) if(os.path.isdir(temp)): getList(temp,pFunc) else: gCount = gCount + 1 if re.search(r'.h$',file): pFunc(dirname,file) #[OK] def loadSiteList(file): file = open(file,"r") sites = file.readlines() return sites #[OK] def removeBR(site): result = re.search(r'\n',site) if result: return site.replace('\n','') return site #[OK] def process(dirname,file): global gCount #[1] #print '[%d]->%s' % (gCount,file) #[2] path = os.path.join(dirname,file) list = loadSiteList(path) #[3] for str in list: parseString(str,path) #[OK] def getClassObject(str): #print str if re.match(r'\s*\*.*\sclass\s',str): return None if re.match(r'\s*\/\/',str): return None if re.match(r'\s*\/\*',str): return None if re.search(r'\w+\sclass\s(\w+)',str): return None if re.search(r'\w+class\s(\w+)',str):#[subclass of] return None if re.search(r'\/\/.*\sclass\s',str): return None if re.search(r'\s*class\s+\w+;',str): return None if re.search(r'template\s*<class\s+(\w+)',str): return None if re.search(r'template\s*<typename\s+(\w+)',str): return None if re.search(r'[\*\(]class\s\w+',str): return None if re.search(r'class\s\w+[\[\]\;\,]',str): return None res = re.search('\s*class\s+(\w+)\s*[^\;,]',str) if res: return res.group(1) return None #[OK] def getParent(str): res = re.search(':\s*public\s+(\w+)\s*',str) if res: return res.group(1) res = re.search(':\s*publi\s*(\w+)$',str) if res: return res.group(1) return None #[Test] objList = [] objMapper = {} def parseString(str,path): global objList,objMapper str = removeBR(str) obj = getClassObject(str) if obj != None: if obj in objList: return else: objList.append(obj) href = toRelPath(path) parent = getParent(str) if parent == "Parent": parent = "Template" #currentNode if obj in objMapper: objMapper[obj].setHref(href) objMapper[obj].setParent(parent) else: gObj = CObject(obj,href) gObj.setParent(parent) objMapper[obj] = gObj #parentNode if parent in objMapper: objMapper[parent].addChild(obj) else: pObj = CObject(parent,None) objMapper[parent] = pObj objMapper[parent].addChild(obj) def link_form(dest): return '-->%s' % (dest) baseLength = len(os.getcwd()) def toRelPath(aPath): global baseLength relPath = aPath[baseLength+1:] return relPath.replace('\\','/') def getPath(obj): global objList,objMapper if obj in objList: return toRelPath(objMapper[obj].href()) else: return "#" #[OK] def showResult(): global objList,objMapper for obj in objList: tmp = obj print objMapper[obj].toAnchor(), objMapper[obj].flushChild() while tmp: tmp = objMapper[tmp].parent() if tmp in objMapper: name = objMapper[tmp].name() if name != None: if name != "RefCounted" and name != "Template": print link_form(objMapper[tmp].toAnchor()) else: ref = r'<a href="#" style="border:1px red solid;color:black;font-weight:bold;">%s</a>' % (tmp) print link_form(ref) print '<hr>' #[0-getData] if not os.path.exists("child"): os.mkdir("child") getList(os.path.join(os.getcwd()),process) #[1-output] print '<div style="width:2000;border:1px red solid;">' showResult() print '</div>'
@@用法说明
C++源码放置于脚本同级目录,然后执行如下脚本
toClass.py > index.html
相关文章推荐
- 最近的状况2014-06-18
- C语言 gets()和scanf()函数的区别
- 第一个C函数
- C语言四书五经
- 【C语言】【面试题】【笔试题】模拟实现数据库中strcat函数
- 【C语言】【面试题】【笔试题】模拟实现数据库中strcpy函数
- 【C语言】【面试题】【笔试题】模拟实现数据库中memcpy函数
- 学习笔记5-C语言指针
- C语言:模拟实现strcpy
- 【笔试题】C语言:模拟实现strcat
- 【C语言】【面试题】【笔试题】模拟实现数据库中memmove函数
- 【笔试题】C语言:模拟实现strcmp
- ClustLib——A C++ Data Clustering Framework(一):数据集相关类设计
- C语言:模拟实现memcpy
- C语言:模拟实现memmove
- 数独游戏的简单回溯解法
- 免费赠与c/c++海量视频 学习资料的
- 一起talk C栗子吧(第六十三回:C语言实例--字符串查找)
- [MFC] CDialog::DoModal()函数用法
- c++顺序容器的学习