前言
我做过一个编程语言: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
表示尚未发现有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>
最后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 ['']
结束
总结一下
作者
hit-road
拜拜,下课!
hit-road不定期跟新,不见不散!