[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流

主循环

  1. 实际上主循环在Parser中
  2. 对于Lexer只需要提供 nextToken / peekToken接口, 让主循环可以提取token

关键函数

  1. nextToken: 下移一个token
  2. peekToken: 用于提前查看下一个token

辅助函数

  1. readChar: 读取一个字符, 移动指向位置
  2. peekChar: 读取下一个字符(但位置指向不变)
  3. readIdentifier
  4. readNumber
  5. readString
  6. skipComment
posted @ 2025-08-15 13:16  会飞的键盘侠  阅读(4)  评论(0)    收藏  举报