[用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

第二-1部分

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

统计大括号的数量


第二-2部分

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

如果可以分段,分段


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

###### 作者 hit-road

拜拜,下课!

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

猜你喜欢

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