[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これはグローバル変数であり、次の3つの状態があります。

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

前記
MYL_NONE_STATUS発見されていない表すbreakか、continue
MYL_BREAK_STATUSを表し見出さbreak
MYL_CONTINUE_STATUS発現見つかったcontinue
status最初MYL_NONE_STATUS、即ち、発見されていないbreak、またはcontinue

後で

    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>
最終的に展開し
、それをエラーが発生した場合、それは、開梱時にのために、より以下の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>、エラーまたは値がfalseの場合は、終了します。

第二部
        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

著者

ヒットロード

さようなら、クラスから出るのは終わった!

ヒットロードは時々更新されます、見るか去ってください!

おすすめ

転載: blog.csdn.net/weixin_42954615/article/details/109007866