c++ 解释器模式_动态编译与解释器模式_解释器模式用处(4)

电脑杂谈  发布时间:2017-02-23 10:43:18  来源:网络整理

执行: 程序内部的解释器根据语义规则进一步处理词法单元,进而执行原指令的实际运算。

这是流程图:

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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 韩宝莉
      韩宝莉

      做法也多没见你列为顶级美食

    热点图片
    拼命载入中...