前言
我做过一个编程语言: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 ['']
执行程序
这里由之前的基础,应该不难理解
总结一下
总结一下:
作者
hit-road
拜拜,下课!
hit-road不定期跟新,不见不散!