[NS语言] 02-分词器
分词器(Lexer) -> Token流
将源代码字符串分解成有意义的
Token序列(标识符, 字面量, 关键字、运算符、分隔符等)
Token设计
NONE, // 无
IDENTIFIER, // 标识符
// 字面量
LIT_INT, // 整数字面量
LIT_FLOAT, // 浮点数字面量
LIT_STRING, // 字符串字面量
LIT_BOOL, // 布尔字面量
LIT_NULL, // null字面量
// 关键字
KW_VAR, // var
KW_ENUM, // enum
KW_FN, // fn
KW_RETURN, // return
KW_IF, // if
KW_ELIF, // elif
KW_ELSE, // else
KW_FOR, // for
KW_WHILE, // while
KW_BREAK, // break
KW_CONTINUE, // continue
KW_IN, // in
// 算术运算符
OP_ASSIGN, // =
OP_ADD, // +
OP_SUB, // -
OP_MUL, // *
OP_DIV, // /
OP_MOD, // %
// 比较运算符
OP_CMP_EQ, // ==
OP_CMP_NE, // !=
OP_CMP_LT, // <
OP_CMP_LE, // <=
OP_CMP_GT, // >
OP_CMP_GE, // >=
// 逻辑运算符
OP_LOGIC_AND, // &&
OP_LOGIC_OR, // ||
OP_LOGIC_NOT, // !
// 位运算符
OP_BIT_AND, // &
OP_BIT_OR, // |
OP_BIT_XOR, // ^
OP_BIT_NOT, // ~
OP_BIT_LS, // <<
OP_BIT_RS, // >>
// 问号
QUESTION, // ?
NULL_COALESCE, // ??
SAFE_ACCESS, // ?.
// 分隔符
SEP_COMMA, // ,
SEP_DOT, // .
SEP_COLON, // :
SEP_RANGE, // ..
// 括号
PAREN_LEFT, // (
PAREN_RIGHT, // )
BRACE_LEFT, // {
BRACE_RIGHT, // }
BRACKET_LEFT, // [
BRACKET_RIGHT, // ]
// 特殊
ARROW, // ->
COMMENT, // 注释
ILLEGAL, // 非法字符
EOF, // 文件结束
解析设计
读取源代码 -> 主循环 -> Token流
主循环
- 实际上主循环在Parser中
- 对于Lexer只需要提供
nextToken/peekToken接口, 让主循环可以提取token
关键函数
- nextToken: 下移一个token
- peekToken: 用于提前查看下一个token
辅助函数
- readChar: 读取一个字符, 移动指向位置
- peekChar: 读取下一个字符(但位置指向不变)
- readIdentifier
- readNumber
- readString
- skipComment

浙公网安备 33010602011771号