[用python自制编程语言]第5篇

前言

我做过一个编程语言: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 ['']

如果有错可报,报错。

总结

Created with Raphaël 2.2.0 开始 分割子块 还有子块未执行? 子块是否是try部分? 执行程序 处理报错 子块是否是catch部分? 子块是否是left部分? 子块是否是else部分? 子块是否是finally部分? 报错 结束 有报错需要处理? yes no yes no yes no yes no yes no yes no yes no

图不太清晰,可以忽略


作者

hit-road

拜拜,下课!

hit-road不定期跟新,不见不散!

猜你喜欢

转载自blog.csdn.net/weixin_42954615/article/details/109863332