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

前言

我做过一个编程语言:mylang

开始

还是一样,看mylang中的代码:

def parse_for(block):
    global status
    try:
        s = block.split('\n')[0]
        init,foo,expression = s[4:-2].split(';')
    except:
        return ['error','ForSentenceError:too many expressions']
    val = comp(init)
    if(val[0] == 'error'):
        return val
    while(1):
        F = comp(foo)
        if(F[0] == 'error'):
            return F
        if(not F[0]):
            break
        for i in block.split('\n')[1:-1]:
            i = i.strip()
            val = comp(i)
            if(val[0] == 'error'):
                return val
            if(status == MYL_BREAK_STATUS):
                status = MYL_NONE_STATUS
                return ['']
            if(status == MYL_CONTINUE_STATUS):
                status = MYL_NONE_STATUS
                break
        val = comp(expression)
        if(val[0] == 'error'):
            return val
    return ['']

参数
block:代码段

第一行

    global status

status是全局变量,有三种状态:

MYL_NONE_STATUS = 0
MYL_BREAK_STATUS = 1
MYL_CONTINUE_STATUS = 2
status = MYL_NONE_STATUS

其中:
MYL_NONE_STATUS表示尚未发现有breakcontinue
MYL_BREAK_STATUS表示发现有break
MYL_CONTINUE_STATUS表示发现有continue
status初始为MYL_NONE_STATUS,即尚未发现有breakcontinue

往后

    try:
        s = block.split('\n')[0]
        init,foo,expression = s[4:-2].split(';')
    except:
        return ['error','ForSentenceError:too many expressions']

要理解此处先要看for的语法:

for(<init>;<foo>;<expression>){
    <code>
}

s是第一行:

for(<init>;<foo>;<expression>){

s[4:-2]即为<init>;<foo>;<expression>
将其分割,成为<init>,<foo>,<expression>
最后unpack掉
如果有报错,说明在unpack时for中有不止或不到3个表达式
那么报错:ForSentenceError:too many expressions

继续

    val = comp(init)
    if(val[0] == 'error'):
        return val

执行<init>表达式

后面

    while(1):
        F = comp(foo)
        if(F[0] == 'error'): 
            return F
        if(not F[0]):
            break
        for i in block.split('\n')[1:-1]:
            i = i.strip()
            val = comp(i)
            if(val[0] == 'error'):
                return val
            if(status == MYL_BREAK_STATUS):
                status = MYL_NONE_STATUS
                return ['']
            if(status == MYL_CONTINUE_STATUS):
                status = MYL_NONE_STATUS
                break
        val = comp(expression)
        if(val[0] == 'error'):
            return val
    return ['']

分解看

第一部分
        F = comp(foo)
        if(F[0] == 'error'): 
            return F
        if(not F[0]):
            break

检查条件式<foo>,如有报错或值为假,退出

第二部分
        for i in block.split('\n')[1:-1]:
            i = i.strip()
            val = comp(i)
            if(val[0] == 'error'):
                return val
            if(status == MYL_BREAK_STATUS):
                status = MYL_NONE_STATUS
                return ['']
            if(status == MYL_CONTINUE_STATUS):
                status = MYL_NONE_STATUS
                break

            i = i.strip()
            val = comp(i)

此处在执行<code>部分的第i行

            if(val[0] == 'error'):
                return val

如果第i行有报错,退出

            if(status == MYL_BREAK_STATUS):
                status = MYL_NONE_STATUS
                return ['']
            if(status == MYL_CONTINUE_STATUS):
                status = MYL_NONE_STATUS
                break

如果是break,退出
如果是continue,放弃执行这次程序循环,但不退出

第三部分
        val = comp(expression)
        if(val[0] == 'error'):
            return val

执行<expression>
如果有报错,退出

最后

	return ['']

结束

总结一下

Created with Raphaël 2.2.0 开始 循环 执行<foo> 执行<code> 执行<expression> 结束 yes no

作者

hit-road

拜拜,下课!

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

猜你喜欢

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