Files
l-language/src/lexer/token.h
T

55 lines
1.6 KiB
C

#ifndef TOKEN_H
#define TOKEN_H
#include "l_lang.h"
// === Token 类型枚举 ===
typedef enum {
// 关键字
TOK_FN, TOK_LET, TOK_VAR, TOK_IF, TOK_ELSE, TOK_WHILE, TOK_FOR, TOK_IN, TOK_RETURN, TOK_GUARD,
TOK_STRUCT, TOK_TYPE, TOK_ENUM, TOK_EXTEND, TOK_MATCH,
// 类型关键字
TOK_I32, TOK_I64, TOK_U64, TOK_F64, TOK_BOOL, TOK_CHAR, TOK_STR, TOK_VOID,
// 字面量
TOK_INT_LIT, TOK_FLOAT_LIT, TOK_CHAR_LIT, TOK_TRUE, TOK_FALSE, TOK_STR_LIT,
// 标识符
TOK_IDENT, TOK_UNDERSCORE,
// 运算符
TOK_PLUS, TOK_MINUS, TOK_STAR, TOK_SLASH, TOK_PERCENT,
TOK_EQ_EQ, TOK_BANG_EQ, TOK_LT, TOK_GT, TOK_LT_EQ, TOK_GT_EQ,
TOK_AND_AND, TOK_PIPE_PIPE, TOK_PIPE, TOK_BANG,
TOK_ARROW, TOK_TO, TOK_MATCH_ARROW,
TOK_PLUS_EQ, TOK_MINUS_EQ, TOK_STAR_EQ, TOK_SLASH_EQ,
// 分隔符
TOK_LPAREN, TOK_RPAREN, TOK_LBRACE, TOK_RBRACE,
TOK_LBRACKET, TOK_RBRACKET,
TOK_COMMA, TOK_COLON, TOK_SEMICOLON, TOK_ASSIGN,
// 特殊
TOK_DOT, TOK_COLON_COLON,
TOK_EOF, TOK_ERROR,
} TokenKind;
// === Token 结构体 ===
struct Token {
TokenKind kind;
const char* start; // 指向源码中 token 起始位置
int length; // token 文本长度
int line;
int col;
};
// === 工具函数 ===
const char* tok_name(TokenKind kind);
bool tok_is_type(TokenKind kind);
// 从 Token 创建 SourceLoc
static inline SourceLoc tok_loc(const Token* tok) {
return (SourceLoc){ .line = tok->line, .col = tok->col };
}
// 从 Token 提取值
int64_t tok_int_value(const Token* tok);
double tok_float_value(const Token* tok);
#endif