执行: 程序内部的解释器根据语义规则进一步处理词法单元,进而执行原指令的实际运算。
这是流程图:
st=>start: 指令
op1=>operation: 解析器
op2=>operation: 词法单元
op3=>operation: 执行运算
e=>end: 结果
st->op1->op2->op3->e
使用tokenize模块。
import tokenize
from StringIO import StringIO
def parse(text):
# 将text以StringIO的形式读入内存
# 以字符串形式返回刀generate_tokens()函数中。
tokens = tokenize.generate_tokens(StringIO(text).readline)
# generate_tokens 生成一个5元组:标记类型、标记字符串、标记开始位置二元组、标记结束位置二元组以及标记所在的行号
# 下面大写的单词都属于token模块的常量
for toknum, tokval, _, _, _ in tokens:
if toknum == tokenize.NUMBER:
yield int(tokval)
elif toknum in [tokenize.OP, tokenize.STRING, tokenize.NAME]:
yield int(tokval)
elif tokun == tokenize.ENDMARKER:
break
else:
raise RuntimeError("Unknown token %s: '%s'" % (tokenize.tok_name[toknum], tokval))
关于token常量,查看。
其中还有一个关键字 yield,它是用来定义(Generator),具体功能是可以当return 使用,从函数理返回一个值,不同之处是用yield 返回之后,可以让函数从上回yield 返回的地点继续执行。也就是说,yield 返回函数,交给调用者一个返回值,然后再移动回去,让函数继续运行下去,知道下一个yield语句再返回一个新的值。c++ 解释器模式举个简单的例子:
>>> def test_yield():
... yield 1
... yield 2
... yield (1,2)
...
>>> a = test_yield()
>>> a.next()
1
>>> a.next()
2
>>> a.next()
(1, 2)
>>> a.next()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
StopIteration
我们用产生一个Fibonacci数列的函数就会更加直观:
def fab(max):
a,b = 0,1
while a < max:
yield a
a, b = b, a+b
>>> for i in fab(20):
... print i,",",
...
0 , 1 , 1 , 2 , 3 , 5 , 8 , 13 ,
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-34020-4.html
做法也多没见你列为顶级美食