From c64315c46b4c733407ec48117903de5fd0543be7 Mon Sep 17 00:00:00 2001 From: DualFroz Date: Mon, 24 Aug 2026 18:39:17 +0200 Subject: [PATCH] feat: implement SQL lexer and token types --- src/main/kotlin/kestrel/sql/lexer/Lexer.kt | Bin 0 -> 5805 bytes src/main/kotlin/kestrel/sql/lexer/Token.kt | 71 +++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 src/main/kotlin/kestrel/sql/lexer/Lexer.kt create mode 100644 src/main/kotlin/kestrel/sql/lexer/Token.kt diff --git a/src/main/kotlin/kestrel/sql/lexer/Lexer.kt b/src/main/kotlin/kestrel/sql/lexer/Lexer.kt new file mode 100644 index 0000000000000000000000000000000000000000..3ff538001145b77f2b67a9c3e72007955231f053 GIT binary patch literal 5805 zcmb_gTT|OO6yE3j3We#^b_t=p0?9*x*4K6Ktwc$)Vf8&5X7rhsy&hW^c`3}!gg#$9PiY}o&U?LS zmR1#kHCo0+$sSWd$zz(4DzD2aJtjAzWPFj3pFIMPr6@^}R}5v45&78J%owMzan#wE z=2^W)o}-@Jo7bF(d__6?m&VC4nXpQn-r~Zz(TRG|B1u&N=eic@Lq?JEYTnSsiIj%4 zPfM0j5{t5?+H73L$A|$boIVSw$6-YprDmAUX0d#=f^nD4K{8r56h8_$;fP2XxA0?l z!DmArB=@SH`3l^Hx$(m(7VQx%#5~U_G0WRDdY5pdwDdP~+$EsEG;$mM_Gz z&4`XHC|$+*d|pv;OfI$*0<*nU`&|(={MUQcDTf^DoJisqY*xwG+O}HNo0pwB)NKXM z;W4I_NJ}wM1rSkb6qwC3T?7^K3_;f$-Ib0@`>_I!3tc(3M=v}?wpIn2ldIu~+AdUtPNkK4Se!wm@IKvQHC8p?>sYHZGFz1%%tdnMq1 zr*I#u>g)L5%|oNk`2Bwc#qm^Ay=BRdLxq1p_BMLN;_#KkZ?pt*-(13zMO&c#54HVNbEegtKvBA3y)FZTOR(+PLgUsR2^435g~OqE2tNFBp2Y?S_p4JoUy27V#+13bSwM zS@eYa ttfFX1c$T8i1%*#)GiTn3`kPzow!<0c1it`;6umQ5a~F-ul`p-Q-hXUFTv`AC literal 0 HcmV?d00001 diff --git a/src/main/kotlin/kestrel/sql/lexer/Token.kt b/src/main/kotlin/kestrel/sql/lexer/Token.kt new file mode 100644 index 0000000..105ad56 --- /dev/null +++ b/src/main/kotlin/kestrel/sql/lexer/Token.kt @@ -0,0 +1,71 @@ +package kestrel.sql.lexer + +enum class TokenType { + Identifier, IntLiteral, RealLiteral, TextLiteral, + Create, Table, Insert, Into, Values, Select, From, Where, + Order, By, Asc, Desc, Limit, Delete, Update, Set, Drop, + And, Or, Not, Null, True, False, Primary, Key, As, + Index, On, Inner, Left, Outer, Join, Group, Having, + Begin, Commit, Rollback, Transaction, Explain, + Integer, Text, Boolean, Real, + Equal, NotEqual, Less, LessEqual, Greater, GreaterEqual, + Plus, Minus, Star, Slash, Dot, + LeftParen, RightParen, Comma, Semicolon, + EndOfInput +} + +data class Token( + val type: TokenType, + val lexeme: String, + val line: Int, + val column: Int, + val intValue: Long? = null, + val realValue: Double? = null, + val textValue: String? = null +) + +internal val keywords: Map = mapOf( + "CREATE" to TokenType.Create, + "TABLE" to TokenType.Table, + "INSERT" to TokenType.Insert, + "INTO" to TokenType.Into, + "VALUES" to TokenType.Values, + "SELECT" to TokenType.Select, + "FROM" to TokenType.From, + "WHERE" to TokenType.Where, + "ORDER" to TokenType.Order, + "BY" to TokenType.By, + "ASC" to TokenType.Asc, + "DESC" to TokenType.Desc, + "LIMIT" to TokenType.Limit, + "DELETE" to TokenType.Delete, + "UPDATE" to TokenType.Update, + "SET" to TokenType.Set, + "DROP" to TokenType.Drop, + "AND" to TokenType.And, + "OR" to TokenType.Or, + "NOT" to TokenType.Not, + "NULL" to TokenType.Null, + "TRUE" to TokenType.True, + "FALSE" to TokenType.False, + "PRIMARY" to TokenType.Primary, + "KEY" to TokenType.Key, + "AS" to TokenType.As, + "INDEX" to TokenType.Index, + "ON" to TokenType.On, + "INNER" to TokenType.Inner, + "LEFT" to TokenType.Left, + "OUTER" to TokenType.Outer, + "JOIN" to TokenType.Join, + "GROUP" to TokenType.Group, + "HAVING" to TokenType.Having, + "BEGIN" to TokenType.Begin, + "COMMIT" to TokenType.Commit, + "ROLLBACK" to TokenType.Rollback, + "TRANSACTION" to TokenType.Transaction, + "EXPLAIN" to TokenType.Explain, + "INTEGER" to TokenType.Integer, + "TEXT" to TokenType.Text, + "BOOLEAN" to TokenType.Boolean, + "REAL" to TokenType.Real +)