CPython开发实战:魔改lambda函数(三)

本次实战内容是受到Javascript的启发,将Python为人诟病已久的lambda函数改成Javascript风格的箭头函数,效果如下:

捕获.JPG

上一章讲到语法分析器的编写和AST树的生成,本章讲解AST树的遍历和符号表的生成。

9. 在Python/symtable.c文件第1994行添加如下代码:

case ArrowLbd_kind: {
        if (e->v.ArrowLbd.args->defaults)
            VISIT_SEQ(st, expr, e->v.ArrowLbd.args->defaults);
        if (e->v.ArrowLbd.args->kw_defaults)
            VISIT_SEQ_WITH_NULL(st, expr, e->v.ArrowLbd.args->kw_defaults);
        if (!symtable_enter_block(st, &_Py_ID(arrowlbd),
                                  FunctionBlock, (void *)e,
                                  e->lineno, e->col_offset,
                                  e->end_lineno, e->end_col_offset))
            VISIT_QUIT(st, 0);
        VISIT(st, arguments, e->v.ArrowLbd.args);
        VISIT(st, expr, e->v.ArrowLbd.body);
        if (!symtable_exit_block(st))
            VISIT_QUIT(st, 0);
        break;
    }

AST树生成后进入CFG生成阶段。

flow4.jpg

控制流图(Control Flow Graph,CFG)是用来表示程序运行过程的树状图。每一个节点代表一个block,block是一段连续的指令集合,且这些指令都是顺序执行。在CFG生成阶段需要遍历两次AST树,第一次为生成各block,第二次为通过跳转指令连接各block。

考虑下面一段代码:

if x > 10 and x < 20:
    f1()
    f2()
else:
    g()

该代码会在CFG生成阶段的第一次遍历中被拆分成四个block:第一个block为处理x>10,第二个block为处理x