标签:记录 names 需要 || 空间 ODB sig 返回 语法分析
typedef Parser {
const char *fname;
const char *source;
Token cur_token; // 不会为cur_token和pre_token赋整个的值, 而是一直在不断的更新cur_token的属性, 而pre_token则是直接通过cur_token拷贝过来的
Token pre_token;
char cur_char;
char *next_char_ptr;
VM *vm; // 在词法分析的时候可能会需要分配内存空间, 这个时候需要vm来记录分配的内存空间
} Parser;
typedef struct Token {
TokenType type;
// ptr 与 length 表示一个单词
char *ptr;
unsigned int length;
unsigned int line_no;
Value value; // 这里为什么会有一个Value呢, 主要是为了方便, 如果Token的类型为num, 则Value直接存放这个值, 如果是其他的则存放其他对象头
} Token;
typedef enum TokenType {
/*
符号:
1. 比较关系符: >, >=, ==, <=, <, !=
2. 逻辑关系符: &&, ||, !
3. 位运算符: &, |, ~
4. 符号: (, [, {, }, ], ), comma(,), dot(.), dotdot(..)
关键字:
1. while
2. for
3. if
4. else
5. break
6. continue
7. import
8. class
9. ...
其他:
1. number
2. string
3. id
*/
} TokenType;
typedef struct VM {
Class *string_class; // 用于让内置的ObjString对象指向它的类对象, 内置的类对象就在这个VM中
Class *fn_class; // 用于让内置的ObjFunc对象的ObjHeader指向Func类对象
Class *num_class;
Class *bool_class;
Class *thread_class;
Class *class_class;
Class *list_class;
Class *map_class;
Class *range_class;
Parser *cur_parser;
int allocated_bytes;
ObjHeader *all_objects; // 有了这个, VM可以调用GC回收对象
ObjThread *cur_thread;
ObjModule *modules;
MethodBuffer allMethodNames;
} VM;
方法
initVM
newVM, 在newVM中会调用initVM, 紧接着就调用buildCore函数, 在buildCore函数中会调用defineClass函数, 定义出内置的ObjectClass, ObjectMetaClass, ClassOfClass类, 并为他们绑定方法(C语言上的函数), 接着executeModule加载执行核心模块
标签:记录 names 需要 || 空间 ODB sig 返回 语法分析
原文地址:https://www.cnblogs.com/megachen/p/10383622.html