Mixer 專案期望在 Proxy 層提供自訂路由、SQL 黑名單與防禦 SQL 注入等功能,核心基礎在於解析使用者送來的 SQL 語句。這涉及詞法分析與語法分析兩大階段,目前已完成一個簡易的詞法分析器,能將 SQL 拆解為 Token 序列;後續的語法分析與 AST 建構仍在探索中。
傳統寫法使用 switch(state) 分派對應的 action,並由 action 回傳下一個 state。隨著 state 增多,case 會膨脹,難以維護。改進方案是採用 State Function:每個 state 即為一個函式,執行完直接回傳下一個 state function,形成鏈式調用。
type stateFn func(*Lexer) stateFn
for state := startState; state != nil; {
state = state(lexer)
}
Lexer 主要對外提供 NextToken() 方法,內部以 channel 暫存解析出的 Token。每個 state function 解析完畢會將 Token 發送至 channel,NextToken 從 channel 取值;若 channel 為空則繼續驅動 state function。
func (l *Lexer) NextToken() (Token, error) {
for {
select {
case t := <-l.tokens:
return t, nil
default:
if l.state == nil {
return Token{TK_EOF, ""}, l.err
}
l.state = l.state(l)
if l.err != nil {
return Token{TK_UNKNOWN, ""}, l.err
}
}
}
}
Go 語言的協程與 channel 機制讓這類「生產者-消費者」模式實作極為自然,剩下的工作便是針對 SQL 的關鍵字、標識符、常數、運算子等編寫對應的 state function。
目前對科學記號法數值的解析尚未完善,後續計劃參考 MySQL 官方詞法模組進一步補強。