MicroPython的解析器实现是在pyexec.c中实现的,核心函数是
STATIC int parse_compile_execute(const void *source, mp_parse_input_kind_t input_kind, int exec_flags)
参数解析:
source : 命令行或者文件名
input_kind:输入类型
exec_flags:执行方式
典型的命令行模式下调用:
parse_compile_execute(&line, MP_PARSE_SINGLE_INPUT, EXEC_FLAG_ALLOW_DEBUGGING | EXEC_FLAG_IS_REPL | EXEC_FLAG_SOURCE_IS_VSTR);
const qstr_pool_t mp_qstr_const_pool = {
NULL, // no previous pool
0, // no previous pool
MICROPY_ALLOC_QSTR_ENTRIES_INIT,
MP_QSTRnumber_of, // corresponds to number of strings in array just below
{
//这里将头文件里面的字符串赋值给qstrpool里面的数组,相当于拷贝到ram中
#ifndef NO_QSTR
#define QDEF(id, str) str,
#include "genhdr/qstrdefs.generated.h"
#undef QDEF
#endif
},
};
// 对id进行enum分配即MP_QSTR_xxx
// first entry in enum will be MP_QSTR_NULL=0, which indicates invalid/no qstr
enum {
#ifndef NO_QSTR
#define QDEF(id, str) id,
#include "genhdr/qstrdefs.generated.h"
#undef QDEF
#endif
MP_QSTRnumber_of, // no underscore so it can't clash with any of the above
};
1、与qstr进行绑定,下面这行代码是与stdio的id绑定 (编译原理 词法分析器)
与stdio绑定的原因是我们选择的是命令行模式,若是文件模式,则调用
lex = mp_lexer_new_from_file(source);
lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, vstr->buf, vstr->len, 0);
2、解析器核心部分对语句进行push pop操作(数据结构为树形 编译原理 语法生成器)
qstr source_name = lex->source_name;
mp_parse_tree_t parse_tree = mp_parse(lex, input_kind);
3、对解析出的数据进行编译(编译原理 中间代码生成器)
module_fun = mp_compile(&parse_tree, source_name, MP_EMIT_OPT_NONE, exec_flags & EXEC_FLAG_IS_REPL);