MicroPython 解析器

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);

编译器前端模型

MicroPython 解析器_第1张图片

符号表管理模块

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);

你可能感兴趣的:(MicroPython 解析器)