Repository navigation
Expand file tree
/
Copy pathRvar.py
More file actions
150 lines (141 loc) · 3.46 KB
/
Copy pathRvar.py
File metadata and controls
150 lines (141 loc) · 3.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
import string
dataType = ['void', 'bool', 'char', 'int', 'long', 'float', 'double', '__int64', 'string']
varCharSet = string.digits + string.ascii_letters + '_'
blank = [' ','\n','\r','\t']
endSign = ['{', ';']
leftQuote = ['(', '[']
rightQuote = [')', ']']
mp = {}
def gen(x):
s = '_'
for i in range(0,x):
s += '_'
return [s, x + 1]
def parseInQuote(s,i,x,wh):
ls = len(s)
ts = ''
while i < ls and s[i] != rightQuote[wh]:
ts += s[i]
i += 1
return [ts+s[i],i+1,x]
def getVariable(s,i,x):
ls = len(s)
ts = ''
flag = True
while flag:
var = ''
while i < ls and s[i] in blank:
ts += s[i]
i += 1
while i < ls and s[i] in varCharSet:
var += s[i]
i += 1
## print 'var = ', var
## print 's[i] = ', s[i]
if var == '':
pass
elif var[0].isdigit():
ts += var
elif var == 'main':
ts += var
elif var in dataType:
ts += var
elif mp.has_key(var):
ts += mp[var]
else:
ts1 = ''
[ts1, x] = gen(x)
mp[var] = ts1
ts += ts1
## print var, '=', ts1
if s[i] in leftQuote:
ts2 = ''
[ts2,i,x] = parseInQuote(s,i,x,leftQuote.index(s[i]))
ts += ts2
elif s[i] == ',':
ts += s[i]
i += 1
elif s[i] in endSign:
flag = False
break
else:
ts += s[i]
i += 1
return [ts, i, x]
def parse(s,i,x):
## print 'parsing from %d _%s_' % (i,s[i])
ls = len(s)
ts = ''
if s[i:i+8] == '#include':
while i < ls and s[i] != '>':
ts += s[i]
i += 1
return [ts+s[i],i+1,x]
hold = 0
flag = True
while flag:
flag = False
for j in dataType:
l = len(j)
if i+l < ls and s[i:i+l] == j and s[i+l] not in varCharSet:
ts += j
i += l
flag = True
break
if flag:
hold += 1
while i < ls and s[i] in blank:
ts += s[i]
i += 1
if hold == 0:
return [ts+s[i], i + 1, x]
tts = ''
[tts, i, x] = getVariable(s,i,x)
ts += tts
return [ts+s[i], i + 1, x]
def replace(s):
ls = len(s)
i = 1
ts = s[0]
inStr = False
inChar = False
while i < ls:
if s[i] == '"':
ts += s[i]
i += 1
while i < ls and (s[i] != '"' or (s[i]=='"' and s[i-1]=='\\')):
ts += s[i]
i += 1
ts += s[i]
i += 1
if s[i] == "'":
ts += s[i]
i += 1
while i < ls and (s[i] != "'" or (s[i]=="'" and s[i-1]=='\\')):
ts += s[i]
i += 1
ts += s[i]
i += 1
if s[i] in varCharSet and s[i-1] not in varCharSet:
ts1 = ''
while i < ls and s[i] in varCharSet:
ts1 += s[i]
i += 1
if mp.has_key(ts1):
ts += mp[ts1]
else:
ts += ts1
else:
ts += s[i]
i += 1
return ts
def trans(s, x):
r = ''
ls = len(s)
i = 0
while i < ls:
[ts, i, x] = parse(s,i,x)
r += ts
## print r
r = replace(r)
return [r, x]