python之自动生成C++的父子双向继承关系

原创 2015年11月19日 00:00:22

## toClass.py

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C++ Boost 之Python(继承)

继承 在Python中继承用Boost.Python扩展的类在Python中支持单继承和多继承.你可以在派生类中任意地混合内建Python类和扩展类.只要Boost.Python 扩展类是在Pytho...
  • Lythm
  • Lythm
  • 2003-07-21 08:14
  • 1791

c++类继承关系

  • 2012-10-23 16:57
  • 205KB
  • 下载

C++类继承关系问题(遗忘好久,拾起来)

C++类继承关系问题  在C++中继承主要有三种关系:public、protected和private。这三种继承关系中public继承是最为常用的一种继承关系,代表了接口继承含义,而他们分别具体代表...

C++类继承关系问题

在C++中继承主要有三种关系:public、protected和private。这三种继承关系中public 继承是最为常用的一种继承关系,代表了接口继承含义,而他们分别具体代表了什么含义呢? 1...
  • Hsuxu
  • Hsuxu
  • 2012-04-10 10:48
  • 516

C++类继承关系问题

在C++中继承主要有三种关系:public、protected和private。这三种继承关系中public 继承是最为常用的一种继承关系,代表了接口继承含义,而他们分别具体代表了什么含义呢? 1...

C++知识点复习——继承关系&动态绑定&虚函数

1、什么是继承继承是实现代码服用的重要手段,在层次关系的顶部有一个基类,其它类则是直接或者间接从基类继承而来的,这些继承而来的类称为派生类。基类负责定义继承的层次关系中所有类公有的成员,而派生类则可以...

C++卷积神经网络实例:tiny_cnn代码详解(3)——层间继承关系

在上一篇博文中我们顺利将tiny_cnn的程序调试通过,在这篇博文中我们尝试从整体角度给出对tiny_cnn这个深度学习框架的解读,重点论述一下其各个层直接类封装的继承关系。   一、卷积神经网...

详谈C++虚函数表那回事(一般继承关系)

C++一般继承关系中虚函数表的深度展现

C++:由输出推断继承关系

C++:由输出推断类之间继承关系标签: C++ 继承by 小威威本文主要是对实验课的“Easy Inheritance”的讲解。题目如下: (Author: 欧文杰(TA))This is the e...

详谈C++虚函数表那回事(多重继承关系)

C++多重继承关系中虚函数表相关
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)