token.go 7.2 KB

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