本次实战内容是受到Javascript的启发,将Python为人诟病已久的lambda函数改成Javascript风格的箭头函数,效果如下:
上一章讲到语法分析器的编写和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生成阶段。
控制流图(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