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++中的继承关系

C++中的继承关系 一、继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生新的类,称派生类。继...
  • eagle_1036077338
  • eagle_1036077338
  • 2016年11月08日 12:50
  • 1211

C++的继承和Java继承的比较

在C++中继承可分为公有继承(public)保护继承(protected)和私有继承(private),而在Java中默认只有一种继承(相当于C++中的公有继承)下面我们来看一段代码#include ...
  • lxq_xsyu
  • lxq_xsyu
  • 2014年12月14日 14:23
  • 2253

C++继承与派生的异同点

C++继承与派生的异同点 在C++中,面向对象有三大特性:封装、继承、多态。今天主要是想写点C++有关继承与多态的内容。 1、基本概念 类的继承是一个新的类从已有的类那里得到已有的特性; 类的派...
  • Jinlong_Xu
  • Jinlong_Xu
  • 2016年10月31日 22:01
  • 689

浅析C++继承与派生

测试环境: Target: x86_64-linux-gnu gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2.1)  定义 要分析继承,首先...
  • qq_33724710
  • qq_33724710
  • 2016年06月11日 10:44
  • 2947

浅析C++中的is-a和has-a关系(公有继承、包含、私有继承)

派生类和基类之间的特俗关系是基于C++继承的底层模型的。 总所周知,C++具有三种继承:公有继承、私有继承、保护继承。最常见的就是公有继承,它建立一种is-a的关系。 如何理解is-a呢?即派生类...
  • wangshubo1989
  • wangshubo1989
  • 2015年10月07日 22:09
  • 3384

c++继承与java继承的区别

C++支持多继承,java不支持多继承,但是java可以通过接口来间接的实现多继承的效果。 先来看看多继承会带来的问题,继承容易导致钻石危机(也称棱形问题),一幅图来说说明: 假设 类...
  • u012441545
  • u012441545
  • 2016年06月13日 19:44
  • 1087

C++之菱形继承

当我们谈C++时,我们谈些什么?    封装,继承,多态。这是C++语言的三大特性,而每次在谈到继承时我们不可避免的要谈到一个很重要的问题——菱形继承。a.菱形继承是什么650) this.width...
  • Monamokia
  • Monamokia
  • 2016年05月30日 13:35
  • 3539

C++中的结构到底可不可以继承?

个人看来,在C++中结构和类没有太大的区别,或者说存在如下区别:在结构中成员默认为public访问,类中为private访问方式 实际上,类与结构的惟一区别在于:在默认状态下,结构的所有成员均是公...
  • JunoLV
  • JunoLV
  • 2015年10月02日 14:47
  • 219

c++类多重继承初始化顺序

c++类多重继承时,初始化顺序是一个基础的问题,笔者每次清楚了以后,过段时间有点含糊了,有些基础的问题,在实际开发中,用到的频率少,今天做一个总结跟大家一起分享。 这里先讨论一般的基类继承时的初始化...
  • u010519381
  • u010519381
  • 2013年08月08日 13:44
  • 3344

C++继承(一) 常用的继承方式

继承的一些基本知识
  • zyl_1102179268
  • zyl_1102179268
  • 2017年03月07日 23:28
  • 2783
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python之自动生成C++的父子双向继承关系
举报原因:
原因补充:

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