2
0

token.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. package lexer
  2. import "fmt"
  3. type TokenType int
  4. const (
  5. // Special tokens
  6. TokenEOF TokenType = iota
  7. TokenError
  8. TokenComment
  9. // Literals
  10. TokenIdent // identifiers
  11. TokenNumber // integers and floats
  12. TokenString // 'string literals'
  13. TokenBlob // X'hex' blob literals
  14. // Operators
  15. TokenPlus // +
  16. TokenMinus // -
  17. TokenStar // *
  18. TokenSlash // /
  19. TokenPercent // %
  20. TokenConcat // ||
  21. TokenEq // =
  22. TokenNeq // <> or !=
  23. TokenLt // <
  24. TokenLte // <=
  25. TokenGt // >
  26. TokenGte // >=
  27. TokenBitAnd // &
  28. TokenBitOr // |
  29. TokenBitNot // ~
  30. TokenShiftLeft // <<
  31. TokenShiftRight // >>
  32. // Punctuation
  33. TokenLParen // (
  34. TokenRParen // )
  35. TokenComma // ,
  36. TokenSemicolon // ;
  37. TokenDot // .
  38. // SQL Keywords - DML
  39. TokenSELECT
  40. TokenFROM
  41. TokenWHERE
  42. TokenAND
  43. TokenOR
  44. TokenNOT
  45. TokenAS
  46. TokenDISTINCT
  47. TokenALL
  48. TokenRETURNING
  49. TokenINSERT
  50. TokenINTO
  51. TokenVALUES
  52. TokenUPDATE
  53. TokenSET
  54. TokenDELETE
  55. // SQL Keywords - DDL
  56. TokenCREATE
  57. TokenDROP
  58. TokenALTER
  59. TokenTABLE
  60. TokenINDEX
  61. TokenVIEW
  62. TokenDATABASE
  63. TokenSCHEMA
  64. TokenADD
  65. TokenCOLUMN
  66. TokenRENAME
  67. TokenTO
  68. // SQL Keywords - Constraints
  69. TokenPRIMARY
  70. TokenKEY
  71. TokenFOREIGN
  72. TokenREFERENCES
  73. TokenUNIQUE
  74. TokenCHECK
  75. TokenCONSTRAINT
  76. TokenDEFAULT
  77. TokenAUTOINCREMENT
  78. // SQL Keywords - Clauses
  79. TokenORDER
  80. TokenBY
  81. TokenASC
  82. TokenDESC
  83. TokenLIMIT
  84. TokenOFFSET
  85. TokenGROUP
  86. TokenHAVING
  87. // SQL Keywords - Joins
  88. TokenJOIN
  89. TokenINNER
  90. TokenLEFT
  91. TokenRIGHT
  92. TokenFULL
  93. TokenOUTER
  94. TokenCROSS
  95. TokenNATURAL
  96. TokenON
  97. TokenUSING
  98. // SQL Keywords - Set operations
  99. TokenUNION
  100. TokenINTERSECT
  101. TokenEXCEPT
  102. // SQL Keywords - Predicates
  103. TokenIN
  104. TokenBETWEEN
  105. TokenLIKE
  106. TokenGLOB
  107. TokenESCAPE
  108. TokenIS
  109. TokenNULL
  110. TokenEXISTS
  111. // SQL Keywords - CASE
  112. TokenCASE
  113. TokenWHEN
  114. TokenTHEN
  115. TokenELSE
  116. TokenEND
  117. // SQL Keywords - Other
  118. TokenCAST
  119. TokenCOALESCE
  120. TokenNULLIF
  121. TokenIF
  122. // Boolean literals
  123. TokenTRUE
  124. TokenFALSE
  125. // Data types
  126. TokenINTEGER
  127. TokenINT
  128. TokenTINYINT
  129. TokenSMALLINT
  130. TokenMEDIUMINT
  131. TokenBIGINT
  132. TokenREAL
  133. TokenFLOAT
  134. TokenDOUBLE
  135. TokenNUMERIC
  136. TokenDECIMAL
  137. TokenTEXT
  138. TokenVARCHAR
  139. TokenCHAR
  140. TokenCHARACTER
  141. TokenCLOB
  142. TokenNCHAR
  143. TokenNVARCHAR
  144. TokenBLOB
  145. TokenBOOLEAN
  146. TokenDATE
  147. TokenTIME
  148. TokenTIMESTAMP
  149. TokenDATETIME
  150. TokenJSON
  151. TokenJSONB
  152. // Transaction keywords
  153. TokenBEGIN
  154. TokenCOMMIT
  155. TokenROLLBACK
  156. TokenTRANSACTION
  157. TokenSAVEPOINT
  158. TokenRELEASE
  159. // SQLite specific
  160. TokenPRAGMA
  161. TokenEXPLAIN
  162. TokenQUERY
  163. TokenPLAN
  164. TokenATTACH
  165. TokenDETACH
  166. TokenVACUUM
  167. TokenANALYZE
  168. TokenREINDEX
  169. // Conflict resolution
  170. TokenREPLACE
  171. TokenIGNORE
  172. TokenFAIL
  173. TokenABORT
  174. TokenCONFLICT
  175. TokenDO
  176. TokenNOTHING
  177. )
  178. var keywords = map[string]TokenType{
  179. // DML
  180. "SELECT": TokenSELECT,
  181. "FROM": TokenFROM,
  182. "WHERE": TokenWHERE,
  183. "AND": TokenAND,
  184. "OR": TokenOR,
  185. "NOT": TokenNOT,
  186. "AS": TokenAS,
  187. "DISTINCT": TokenDISTINCT,
  188. "ALL": TokenALL,
  189. // RETURNING is a keyword so it is not mistaken for a table/column alias in
  190. // INSERT ... SELECT ... RETURNING.
  191. "RETURNING": TokenRETURNING,
  192. "INSERT": TokenINSERT,
  193. "INTO": TokenINTO,
  194. "VALUES": TokenVALUES,
  195. "UPDATE": TokenUPDATE,
  196. "SET": TokenSET,
  197. "DELETE": TokenDELETE,
  198. // DDL
  199. "CREATE": TokenCREATE,
  200. "DROP": TokenDROP,
  201. "ALTER": TokenALTER,
  202. "TABLE": TokenTABLE,
  203. "INDEX": TokenINDEX,
  204. "VIEW": TokenVIEW,
  205. "DATABASE": TokenDATABASE,
  206. "SCHEMA": TokenSCHEMA,
  207. "ADD": TokenADD,
  208. "COLUMN": TokenCOLUMN,
  209. "RENAME": TokenRENAME,
  210. "TO": TokenTO,
  211. // Constraints
  212. "PRIMARY": TokenPRIMARY,
  213. "KEY": TokenKEY,
  214. "FOREIGN": TokenFOREIGN,
  215. "REFERENCES": TokenREFERENCES,
  216. "UNIQUE": TokenUNIQUE,
  217. "CHECK": TokenCHECK,
  218. "CONSTRAINT": TokenCONSTRAINT,
  219. "DEFAULT": TokenDEFAULT,
  220. "AUTOINCREMENT": TokenAUTOINCREMENT,
  221. // Clauses
  222. "ORDER": TokenORDER,
  223. "BY": TokenBY,
  224. "ASC": TokenASC,
  225. "DESC": TokenDESC,
  226. "LIMIT": TokenLIMIT,
  227. "OFFSET": TokenOFFSET,
  228. "GROUP": TokenGROUP,
  229. "HAVING": TokenHAVING,
  230. // Joins
  231. "JOIN": TokenJOIN,
  232. "INNER": TokenINNER,
  233. "LEFT": TokenLEFT,
  234. "RIGHT": TokenRIGHT,
  235. "FULL": TokenFULL,
  236. "OUTER": TokenOUTER,
  237. "CROSS": TokenCROSS,
  238. "NATURAL": TokenNATURAL,
  239. "ON": TokenON,
  240. "USING": TokenUSING,
  241. // Set operations
  242. "UNION": TokenUNION,
  243. "INTERSECT": TokenINTERSECT,
  244. "EXCEPT": TokenEXCEPT,
  245. // Predicates
  246. "IN": TokenIN,
  247. "BETWEEN": TokenBETWEEN,
  248. "LIKE": TokenLIKE,
  249. "GLOB": TokenGLOB,
  250. "ESCAPE": TokenESCAPE,
  251. "IS": TokenIS,
  252. "NULL": TokenNULL,
  253. "EXISTS": TokenEXISTS,
  254. // CASE
  255. "CASE": TokenCASE,
  256. "WHEN": TokenWHEN,
  257. "THEN": TokenTHEN,
  258. "ELSE": TokenELSE,
  259. "END": TokenEND,
  260. // Other
  261. "CAST": TokenCAST,
  262. "COALESCE": TokenCOALESCE,
  263. "NULLIF": TokenNULLIF,
  264. "IF": TokenIF,
  265. // Boolean
  266. "TRUE": TokenTRUE,
  267. "FALSE": TokenFALSE,
  268. // Data types
  269. "INTEGER": TokenINTEGER,
  270. "INT": TokenINT,
  271. "TINYINT": TokenTINYINT,
  272. "SMALLINT": TokenSMALLINT,
  273. "MEDIUMINT": TokenMEDIUMINT,
  274. "BIGINT": TokenBIGINT,
  275. "REAL": TokenREAL,
  276. "FLOAT": TokenFLOAT,
  277. "DOUBLE": TokenDOUBLE,
  278. "NUMERIC": TokenNUMERIC,
  279. "DECIMAL": TokenDECIMAL,
  280. "TEXT": TokenTEXT,
  281. "VARCHAR": TokenVARCHAR,
  282. "CHAR": TokenCHAR,
  283. "CHARACTER": TokenCHARACTER,
  284. "CLOB": TokenCLOB,
  285. "NCHAR": TokenNCHAR,
  286. "NVARCHAR": TokenNVARCHAR,
  287. "BLOB": TokenBLOB,
  288. "BOOLEAN": TokenBOOLEAN,
  289. "DATE": TokenDATE,
  290. "TIME": TokenTIME,
  291. "TIMESTAMP": TokenTIMESTAMP,
  292. "DATETIME": TokenDATETIME,
  293. "JSON": TokenJSON,
  294. "JSONB": TokenJSONB,
  295. // Transactions
  296. "BEGIN": TokenBEGIN,
  297. "COMMIT": TokenCOMMIT,
  298. "ROLLBACK": TokenROLLBACK,
  299. "TRANSACTION": TokenTRANSACTION,
  300. "SAVEPOINT": TokenSAVEPOINT,
  301. "RELEASE": TokenRELEASE,
  302. // SQLite specific
  303. "PRAGMA": TokenPRAGMA,
  304. "EXPLAIN": TokenEXPLAIN,
  305. "QUERY": TokenQUERY,
  306. "ATTACH": TokenATTACH,
  307. "DETACH": TokenDETACH,
  308. "VACUUM": TokenVACUUM,
  309. "ANALYZE": TokenANALYZE,
  310. "REINDEX": TokenREINDEX,
  311. // Conflict resolution
  312. "REPLACE": TokenREPLACE,
  313. "IGNORE": TokenIGNORE,
  314. "FAIL": TokenFAIL,
  315. "ABORT": TokenABORT,
  316. "CONFLICT": TokenCONFLICT,
  317. "DO": TokenDO,
  318. "NOTHING": TokenNOTHING,
  319. }
  320. // LookupKeyword returns the token type for an identifier.
  321. // If the identifier is a keyword, returns the keyword token type.
  322. // Otherwise, returns TokenIdent.
  323. func LookupKeyword(ident string) TokenType {
  324. if tok, ok := keywords[ident]; ok {
  325. return tok
  326. }
  327. return TokenIdent
  328. }
  329. // Token represents a lexical token.
  330. type Token struct {
  331. Type TokenType
  332. Literal string
  333. Line int
  334. Column int
  335. }
  336. func (t Token) String() string {
  337. return fmt.Sprintf("Token{Type: %v, Literal: %q, Line: %d, Col: %d}",
  338. t.Type, t.Literal, t.Line, t.Column)
  339. }
  340. // IsKeyword returns true if the token is a SQL keyword.
  341. func (t Token) IsKeyword() bool {
  342. return t.Type >= TokenSELECT
  343. }
  344. // IsOperator returns true if the token is an operator.
  345. func (t Token) IsOperator() bool {
  346. return t.Type >= TokenPlus && t.Type <= TokenGte
  347. }
  348. var tokenNames = map[TokenType]string{
  349. TokenEOF: "EOF",
  350. TokenError: "ERROR",
  351. TokenComment: "COMMENT",
  352. TokenIdent: "IDENT",
  353. TokenNumber: "NUMBER",
  354. TokenString: "STRING",
  355. TokenBlob: "BLOB",
  356. TokenPlus: "+",
  357. TokenMinus: "-",
  358. TokenStar: "*",
  359. TokenSlash: "/",
  360. TokenPercent: "%",
  361. TokenConcat: "||",
  362. TokenEq: "=",
  363. TokenNeq: "<>",
  364. TokenLt: "<",
  365. TokenLte: "<=",
  366. TokenGt: ">",
  367. TokenGte: ">=",
  368. TokenBitAnd: "&",
  369. TokenBitOr: "|",
  370. TokenBitNot: "~",
  371. TokenShiftLeft: "<<",
  372. TokenShiftRight: ">>",
  373. TokenLParen: "(",
  374. TokenRParen: ")",
  375. TokenComma: ",",
  376. TokenSemicolon: ";",
  377. TokenDot: ".",
  378. }
  379. func (t TokenType) String() string {
  380. if name, ok := tokenNames[t]; ok {
  381. return name
  382. }
  383. // For keywords, look up in reverse
  384. for kw, tok := range keywords {
  385. if tok == t {
  386. return kw
  387. }
  388. }
  389. return fmt.Sprintf("TOKEN(%d)", t)
  390. }