正则表达式的用法网上非常详细,我就不再细说。百度百科的说明就不错:http://baike.baidu.com/view/94238.htm
我只简要说下脚本内容 ,这是转换常见内容的脚本,基本c转换c++都用得上的。有具体要求的,需要转换特定语句的,可以以这个为基础改,代码奉上:
import re
def convertFuncDef(lines , lineNo):
line = lines[lineNo]
paras = {}
while not re.match('^\s*{\s*$' , line):
mp = re.match('^\s*(double\s*\**|float\s*\**|char\s*\**|long\s*\**|int\s*\**)\s*([^;]+);\s*$' , line)
args = mp.group(2).split(',')
for arg in args:
if len(arg.strip())==0 : continue
tmp = arg.strip()
if '[' in tmp : tmp = arg[:arg.find('[')].strip() # get rid of [x], for example 'window[13]'
paras[tmp] = '%s %s'%(mp.group(1).strip(), arg.strip())
lineNo+=1
line = lines[lineNo]
return lineNo, paras
def detectPattern(lines):
lineNo=0
# h =(double **)malloc(sizeof(double *)*n7);
malloc2 = re.compile(r'^\s*(\w+)\s*=\s*\(\s*(double|float|int)\s*\*\*\)\s*malloc\s*\(\s*sizeof\s*\(\s*(double|float|int)\s*\*\s*\)\s*\*\s*(\w+)\s*\)\s*;\s*$')
# for(i=0; i0: print '\n'.join(['----']*(lN-lineNo))
lineNo = lN
else:
print curline
f = open('abc.c' , 'rb')
lines = f.readlines()
f.close()
detectPattern(lines)
# h =(double **)malloc(sizeof(double *)*n7);
malloc2 = re.compile(r'^\s*(\w+)\s*=\s*\(\s*(double|float|int)\s*\*\*\)\s*malloc\s*\(\s*sizeof\s*\(\s*(double|float|int)\s*\*\s*\)\s*\*\s*(\w+)\s*\)\s*;\s*$')
# (\w+) 匹配 h
# (double|float|int) 匹配 double 、 float 、 int之一
# (\w+) 匹配 n7
再看free的
# for(i=0; i
变量定义
# double **v0; 指针类型不安全,且长度不易管理
varDef = re.compile(r'^\s*(bool\s*\*+|float\s*\*+|double\s*\*+|int\s*\*+|long\s*\*+)\s*(\w+)\s*;\s*$')
# (bool\s*\*+|float\s*\*+|double\s*\*+|int\s*\*+|long\s*\*+) 匹配bool、float、double、int、long类型之一或是它们的指针类型
# (\w+) 匹配 v0
函数转换
老式的c语言中,允许类似于的定义
void dral(x9, y9, k9, p0, w)
double w[12];
double x9, y9;
long p0, k9;
现在要把它转换成
void exti( long ** ss,long n7,long n8,long m7 )
首先,函数头处理
# void dral(x9, y9, k9, p0, w)
funcDef = re.compile(r'^\s*(void\s*\**|bool\s*\**|float\s*\**|double\s*\**|int\s*\**|long\s*\**)\s*(\w+)\s*\(\s*([^\)]*)\)\s*$')
# 函数返回类型 和前面相似,不再细说
# ([^\)]*) 匹配 dral(...)省略号内容,也就是参数,这个参数顺序是调用函数时使用的,要保存下来。
函数参数处理
mp = re.match('^\s*(double\s*\**|float\s*\**|char\s*\**|long\s*\**|int\s*\**)\s*([^;]+);\s*$' , line)
# 参数类型匹配和之前一样
# ([^;]+) 匹配 ;之前的所有参数,以','分割,之后制作一个字典,以'参数名:参数定义'为键值对。例如,'x9:long x9',再以之前参数顺序组合,就 得得参数列表