前言
我做过一个编程语言:mylang
开始
上代码
def parse_try(block):
error = '''traceback:
{0}'''
subBlocks = split_subBlocks(block)
if(subBlocks[0] == 'error'):
return subBlocks
flag = None
flag2 = True
errors = []
for i in subBlocks:
if(i.startswith('try')):
code = [j.strip() for j in i.split('\n')[1:-1]]
for i in code:
val = comp(i)
if(val[0] == 'error'):
flag = val[1]
break
elif(i.startswith('catch') and flag):
errorName = i.split('\n')[0][6:-1]
if(flag.split(':')[0].strip() == errorName):
flag2 = False
code = [j.strip() for j in i.split('\n')[1:-1]]
for i in code:
val = comp(i)
if(val[0] == 'error'):
errors.append(val[1])
break
elif(i.startswith('left') and flag and flag2):
varName = i.split('\n')[0][5:-1]
var[varName[:-1]] = flag
code = [j.strip() for j in i.split('\n')[1:-1]]
for i in code:
val = comp(i)
if(val[0] == 'error'):
errors.append(val[1])
break
elif(i.startswith('else') and not flag):
code = [j.strip() for j in i.split('\n')[1:-1]]
for i in code:
val = comp(i)
if(val[0] == 'error'):
errors.append(val[1])
break
elif(i.startswith('finally')):
code = [j.strip() for j in i.split('\n')[1:-1]]
for i in code:
val = comp(i)
if(val[0] == 'error'):
errors.append(val[1])
break
else:
return ['error','TrySentenceError:find undefined branch head']
if(errors and flag):
print()
print(error.format(flag))
for i in range(len(errors)):
print('\nDuring handling the error above,another error occurred\n')
print(error.format(errors[i]))
elif(errors):
for i in range(len(errors)):
if(i != 0):
print('\nDuring handling the error above,another error occurred\n')
print(error.format(errors[i]))
return ['']
参数
block
:代码
一开始
error = '''traceback:
{0}'''
subBlocks = split_subBlocks(block)
if(subBlocks[0] == 'error'):
return subBlocks
定义报错格式error
并分割子块(分割子块代码)。
后面
flag = None
flag2 = True
errors = []
定义:
- 用于存放
try
部分报错的flag变量 - 用于存放报错是否已处理的flag变量
- 存储曾出现错误的errors数组
继续
for i in subBlocks:
if(i.startswith('try')):
code = [j.strip() for j in i.split('\n')[1:-1]]
for i in code:
val = comp(i)
if(val[0] == 'error'):
flag = val[1]
break
elif(i.startswith('catch') and flag):
errorName = i.split('\n')[0][6:-1]
if(flag.split(':')[0].strip() == errorName):
flag2 = False
code = [j.strip() for j in i.split('\n')[1:-1]]
for i in code:
val = comp(i)
if(val[0] == 'error'):
errors.append(val[1])
break
elif(i.startswith('left') and flag and flag2):
varName = i.split('\n')[0][5:-1]
var[varName[:-1]] = flag
code = [j.strip() for j in i.split('\n')[1:-1]]
for i in code:
val = comp(i)
if(val[0] == 'error'):
errors.append(val[1])
break
elif(i.startswith('else') and not flag):
code = [j.strip() for j in i.split('\n')[1:-1]]
for i in code:
val = comp(i)
if(val[0] == 'error'):
errors.append(val[1])
break
elif(i.startswith('finally')):
code = [j.strip() for j in i.split('\n')[1:-1]]
for i in code:
val = comp(i)
if(val[0] == 'error'):
errors.append(val[1])
break
下面分解
一开始
if(i.startswith('try')):
code = [j.strip() for j in i.split('\n')[1:-1]]
for i in code:
val = comp(i)
if(val[0] == 'error'):
flag = val[1]
break
执行try
中的内容,存储错误。
往后
elif(i.startswith('catch') and flag):
errorName = i.split('\n')[0][6:-1]
if(flag.split(':')[0].strip() == errorName):
flag2 = False
code = [j.strip() for j in i.split('\n')[1:-1]]
for i in code:
val = comp(i)
if(val[0] == 'error'):
errors.append(val[1])
break
如果有错误时执行catch
中的内容。如果有报错,压入errors
数组中。
继续
elif(i.startswith('left') and flag and flag2):
varName = i.split('\n')[0][5:-1]
var[varName[:-1]] = flag
code = [j.strip() for j in i.split('\n')[1:-1]]
for i in code:
val = comp(i)
if(val[0] == 'error'):
errors.append(val[1])
break
如果有错误且并未被处理时执行left
中的内容。如果有报错,压入errors
数组中。
再往后
elif(i.startswith('else') and not flag):
code = [j.strip() for j in i.split('\n')[1:-1]]
for i in code:
val = comp(i)
if(val[0] == 'error'):
errors.append(val[1])
break
如果无错误时执行else
中的内容。如果有报错,压入errors
数组中。
最后
else:
return ['error','TrySentenceError:find undefined branch head']
如果是未知段头,报错。
再往后
elif(i.startswith('finally')):
code = [j.strip() for j in i.split('\n')[1:-1]]
for i in code:
val = comp(i)
if(val[0] == 'error'):
errors.append(val[1])
break
执行finally
中的内容。如果有报错,压入errors
数组中。
再往后
if(errors and flag):
print()
print(error.format(flag))
for i in range(len(errors)):
print('\nDuring handling the error above,another error occurred\n')
print(error.format(errors[i]))
elif(errors):
for i in range(len(errors)):
if(i != 0):
print('\nDuring handling the error above,another error occurred\n')
print(error.format(errors[i]))
return ['']
如果有错可报,报错。
总结
图不太清晰,可以忽略
作者
hit-road
拜拜,下课!
hit-road不定期跟新,不见不散!