2
0

token.go 7.0 KB

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