这是有Python语法分析的一个例子。在开发一个小软件中要用到。
def countspaces(string):
"""统计string前面的空格数"""
spaces = 0
for char in string: #
if char !=' ':break
if char == ' ':spaces += 1
return spaces
def insertbreak(programes,breakstatement):
"""
给循环增加中断指令,以便按中止时循环会退出
programes:代码列表,breakstatement:中断指令,
只支持空格为缩进的代码!!
"""
index = 0
amounts = len(programes)
while index < amounts:
code = programes[index]
tmpcode = code.strip()
if tmpcode.startswith('while') or tmpcode.startswith('for') and ":" in tmpcode:
# 检测在冒号后是否有语句,如果有,则移到下一行
singleline = code.split(":")
#aftercolon = singleline[-1].strip()
aftercolon = ":".join(singleline[1:])
aftercolon = aftercolon.strip() # 冒号后去除两边空格字符串
if len(aftercolon)>0: # 如果冒号后有语句
if not aftercolon.startswith("#"): # 如果不是#号开头则认为是一条语句
programes[index] = singleline[0] + ":" # 冒号前面的代码
# 统计singleline[0]前面的空格数
spaces = countspaces(singleline[0]) + 4 # 加4表示要缩进
insertedcode = spaces * " " + breakstatement
programes.insert(index+1,insertedcode)
index = index + 1
# 把冒号后面的代码插下到列表的下一项,后面代码的依次往后移
programes.insert(index+1,spaces * " " + aftercolon)
index = index + 1
else:
# 否则在冒号后只是注释,则直接在while或for循环下面插入一条中断
spaces = countspaces(programes[index+1])# 统计for或while下一行代码前面空格数
insertedcode = spaces * " " + breakstatement
programes.insert(index+1,insertedcode)
index = index + 1
amounts = len(programes)
else:
# 否则在冒号后并没有语句,则直接在while或for循环下面插入一条中断
spaces = countspaces(programes[index+1])# 统计for或while下一行代码前面空格数
insertedcode = spaces * " " + breakstatement
programes.insert(index+1,insertedcode)
index = index + 1
amounts = len(programes)
index = index + 1
allcodes = """
for y in range(3):
a='for x in range(1000):print(abcd);break'
s = 'while x>3: pass'
y = 0
for x in zip(abcd,efg):#这是for循环呀
for x in range(4):print(x,end='')
while True:
import os
for _ in range(10):
for x in range(10000000000000):
bug.fd(10)
bug.rt(10)
for y in range(acd):
pass
while True: # 哟西这是一个while循环呢
pass
for _ in range(100):
pass
while True:pass
for x in 'abcdefg': # THis is a test
print('x')
print('为了我国的')
while True:for _ in range(10):print(10)
"""
allcodes = allcodes.split("\n")
stopcode = 'if stopexec == True:break'
insertbreak(allcodes,stopcode)
临时 = '\n'.join(allcodes)
f = open('c:/abcd.py',mode='w',encoding='utf-8')
f.write(临时)
f.close()
print(临时)
