Files
MetonaSqlark/src/sql/tokens.ts
T
thzxx 334067d89e
CI / test (18.x) (push) Successful in 10m10s
CI / test (20.x) (push) Successful in 10m10s
CI / test (22.x) (push) Successful in 10m6s
CI / e2e (push) Successful in 9m51s
CI / test (24.x) (push) Successful in 10m28s
release: v0.5.1 — 存储后端生产级硬化(CRC-32/全库加密/WAL分片/页面化存储/多标签页锁/e2e)+ 深度审查修复(假实现接线/死代码清理)
2026-08-10 12:07:00 +08:00

217 lines
4.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* metona-sqlark SQL Token Types — 词法单元定义
* @module sql/tokens
*/
// ---------------------------------------------------------------------------
// Token 类型枚举
// ---------------------------------------------------------------------------
export enum TokenType {
// 关键字
SELECT = 'SELECT',
FROM = 'FROM',
WHERE = 'WHERE',
INSERT = 'INSERT',
INTO = 'INTO',
VALUES = 'VALUES',
UPDATE = 'UPDATE',
SET = 'SET',
DELETE = 'DELETE',
CREATE = 'CREATE',
TABLE = 'TABLE',
DROP = 'DROP',
ORDER = 'ORDER',
BY = 'BY',
ASC = 'ASC',
DESC = 'DESC',
LIMIT = 'LIMIT',
OFFSET = 'OFFSET',
AND = 'AND',
OR = 'OR',
NOT = 'NOT',
LIKE = 'LIKE',
IN = 'IN',
PRIMARY = 'PRIMARY',
KEY = 'KEY',
UNIQUE = 'UNIQUE',
DEFAULT = 'DEFAULT',
NULL = 'NULL',
TRUE = 'TRUE',
REFERENCES = 'REFERENCES',
CASCADE = 'CASCADE',
BETWEEN = 'BETWEEN',
IF = 'IF',
EXISTS = 'EXISTS',
FALSE = 'FALSE',
ALTER = 'ALTER',
ADD = 'ADD',
TRUNCATE = 'TRUNCATE',
// JOIN 相关
INNER = 'INNER',
LEFT = 'LEFT',
RIGHT = 'RIGHT',
CROSS = 'CROSS',
JOIN = 'JOIN',
ON = 'ON',
AS = 'AS',
OUTER = 'OUTER',
// 聚合
GROUP = 'GROUP',
HAVING = 'HAVING',
COUNT = 'COUNT',
SUM = 'SUM',
AVG = 'AVG',
MIN = 'MIN',
MAX = 'MAX',
DISTINCT = 'DISTINCT',
// v0.3.0: 事务 / UNION / EXISTS / 动态索引
BEGIN = 'BEGIN',
COMMIT = 'COMMIT',
ROLLBACK = 'ROLLBACK',
UNION = 'UNION',
ALL = 'ALL',
INDEX = 'INDEX',
// v0.3.1: CASE WHEN 表达式
CASE = 'CASE',
WHEN = 'WHEN',
THEN = 'THEN',
ELSE = 'ELSE',
END = 'END',
// v0.5.1: 维护语句(EXPLAIN / ANALYZE / REINDEX / VACUUM / SAVEPOINT
EXPLAIN = 'EXPLAIN',
ANALYZE = 'ANALYZE',
REINDEX = 'REINDEX',
VACUUM = 'VACUUM',
SAVEPOINT = 'SAVEPOINT',
RELEASE = 'RELEASE',
TO = 'TO',
// 标识符 & 字面量
IDENTIFIER = 'IDENTIFIER',
STRING = 'STRING',
NUMBER = 'NUMBER',
// 运算符 & 分隔符
COMMA = 'COMMA',
LPAREN = 'LPAREN',
RPAREN = 'RPAREN',
SEMICOLON = 'SEMICOLON',
EQ = 'EQ',
NEQ = 'NEQ',
GT = 'GT',
GTE = 'GTE',
LT = 'LT',
LTE = 'LTE',
STAR = 'STAR',
DOT = 'DOT',
// 特殊
EOF = 'EOF',
ILLEGAL = 'ILLEGAL',
}
// ---------------------------------------------------------------------------
// Token
// ---------------------------------------------------------------------------
export interface Token {
type: TokenType;
value: string;
position: number; // 在源码中的位置
}
// ---------------------------------------------------------------------------
// 关键字映射
// ---------------------------------------------------------------------------
export const KEYWORDS: Record<string, TokenType> = {
'SELECT': TokenType.SELECT,
'FROM': TokenType.FROM,
'WHERE': TokenType.WHERE,
'INSERT': TokenType.INSERT,
'INTO': TokenType.INTO,
'VALUES': TokenType.VALUES,
'UPDATE': TokenType.UPDATE,
'SET': TokenType.SET,
'DELETE': TokenType.DELETE,
'CREATE': TokenType.CREATE,
'TABLE': TokenType.TABLE,
'DROP': TokenType.DROP,
'ORDER': TokenType.ORDER,
'BY': TokenType.BY,
'ASC': TokenType.ASC,
'DESC': TokenType.DESC,
'LIMIT': TokenType.LIMIT,
'OFFSET': TokenType.OFFSET,
'AND': TokenType.AND,
'OR': TokenType.OR,
'NOT': TokenType.NOT,
'LIKE': TokenType.LIKE,
'IN': TokenType.IN,
'PRIMARY': TokenType.PRIMARY,
'KEY': TokenType.KEY,
'UNIQUE': TokenType.UNIQUE,
'DEFAULT': TokenType.DEFAULT,
'NULL': TokenType.NULL,
'TRUE': TokenType.TRUE,
'FALSE': TokenType.FALSE,
'REFERENCES': TokenType.REFERENCES,
'CASCADE': TokenType.CASCADE,
'BETWEEN': TokenType.BETWEEN,
'IF': TokenType.IF,
'EXISTS': TokenType.EXISTS,
'ALTER': TokenType.ALTER,
'ADD': TokenType.ADD,
'TRUNCATE': TokenType.TRUNCATE,
// JOIN
'INNER': TokenType.INNER,
'LEFT': TokenType.LEFT,
'RIGHT': TokenType.RIGHT,
'CROSS': TokenType.CROSS,
'JOIN': TokenType.JOIN,
'ON': TokenType.ON,
'AS': TokenType.AS,
'OUTER': TokenType.OUTER,
// 聚合
'GROUP': TokenType.GROUP,
'HAVING': TokenType.HAVING,
'COUNT': TokenType.COUNT,
'SUM': TokenType.SUM,
'AVG': TokenType.AVG,
'MIN': TokenType.MIN,
'MAX': TokenType.MAX,
'DISTINCT': TokenType.DISTINCT,
// v0.3.0
'BEGIN': TokenType.BEGIN,
'COMMIT': TokenType.COMMIT,
'ROLLBACK': TokenType.ROLLBACK,
'UNION': TokenType.UNION,
'ALL': TokenType.ALL,
'INDEX': TokenType.INDEX,
// v0.3.1
'CASE': TokenType.CASE,
'WHEN': TokenType.WHEN,
'THEN': TokenType.THEN,
'ELSE': TokenType.ELSE,
'END': TokenType.END,
// v0.5.1
'EXPLAIN': TokenType.EXPLAIN,
'ANALYZE': TokenType.ANALYZE,
'REINDEX': TokenType.REINDEX,
'VACUUM': TokenType.VACUUM,
'SAVEPOINT': TokenType.SAVEPOINT,
'RELEASE': TokenType.RELEASE,
'TO': TokenType.TO,
};