[Pythonの自作プログラミング言語を使用する]パート4

序文

私はプログラミング言語を実行しました:mylang

開始

コードをアップロード

def split_subBlocks(block):
    subBlocks = []
    cnt = 0
    buf = ''
    flag = False
    for i in block:
        if(i == '{'):
            cnt += 1
            flag = True
        elif(i == '}'):
            cnt -= 1
            flag = True
        if(cnt == 0 and flag):
            subBlocks.append(buf)
            buf = ''
            flag = False
        else:
            buf += i
    subBlocks[-1] += '}'
    return subBlocks
# ......N行之后......
def parse_if(block):
    subBlocks = split_subBlocks(block)
    if(subBlocks[0] == 'error'):
        return subBlocks
    for i in subBlocks:
        if(i.startswith('if')):
            foo = i.split('\n')[0][3:-2]
        elif(i.startswith('elsif')):
            foo = i.split('\n')[0][6:-2]
        elif(i.startswith('else')):
            foo = 'true'
        else:
            return ['error','IfSentenceError:find undefined branch head']
        code = [j.strip() for j in i.split('\n')[1:-1]]
        F = comp(foo)
        if(F[0] == 'error'):
            return F
        if(F[0]):
            for i in code:
                val = comp(i)
                if(val[0] == 'error'):
                    return val
            return ['']
    return ['']

パラメータ
block:コード

初めに
    subBlocks = split_subBlocks(block)
    if(subBlocks[0] == 'error'):
        return subBlocks

ここで、if、elsif、elseの各ブロックを分離するには、split_subBlocksのコードを見てください。

def split_subBlocks(block):
   subBlocks = []
   cnt = 0
   buf = ''
   flag = False
   for i in block:
       if(i == '{'):
         cnt += 1
           flag = True
       elif(i == '}'):
           cnt -= 1
           flag = True
       if(cnt == 0 and flag):
           subBlocks.append(buf)
           buf = ''
           flag = False
       else:
           buf += i
   subBlocks[-1] += '}'
   return subBlocks

最初の部分

def split_subBlocks(block):
   subBlocks = []
   cnt = 0
   buf = ''

ここで、変数subBlocks(ブロック)、cnt(ペアになるブラケットの数)、buf(セグメント化されていない文)を定義します。



第二部

for i in block:
       if(i == '{'):
         cnt += 1
           flag = True
       elif(i == '}'):
           cnt -= 1
           flag = True
       if(cnt == 0 and flag):
           subBlocks.append(buf)
           buf = ''
           flag = False
       else:
           buf += i

パートII-1

       if(i == '{'):
         cnt += 1
           flag = True
       elif(i == '}'):
           cnt -= 1
           flag = True

中括弧の数を数える


パート2-2

       if(cnt == 0 and flag):
           subBlocks.append(buf)
           buf = ''
           flag = False

セグメント化できる場合は、セグメント化


パートII-3

      else:
          buf += i

セグメント化できない場合は、セグメント化されていない文として記録します

後ろに
    for i in subBlocks:
        if(i.startswith('if')):
            foo = i.split('\n')[0][3:-2]
        elif(i.startswith('elsif')):
            foo = i.split('\n')[0][6:-2]
        elif(i.startswith('else')):
            foo = 'true'
        else:
            return ['error','IfSentenceError:find undefined branch head']

この段落の先頭を分析する

続ける
        code = [j.strip() for j in i.split('\n')[1:-1]]
        F = comp(foo)
        if(F[0] == 'error'):
            return F
        if(F[0]):
            for i in code:
                val = comp(i)
                if(val[0] == 'error'):
                    return val
            return ['']
    return ['']

ここでの実行手順
は前のものに基づいており、理解するのは難しいことではありません

結論として

結論として:

Created with Raphaël 2.2.0 开始 分割代码块 遍历代码块 若块头为if 获取条件 执行代码 若还有代码块未执行 结束 若块头为elsif 获取条件 若块头为else 设条件为true 报错 yes no yes no yes no yes no

######作者のヒットロード

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

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

おすすめ

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