mixer sql詞法分析器設計

2021-06-21 03:48:14 字數 1584 閱讀 2103

mixer希望在proxy這層就提供自定義路由,sql黑名單,防止sql注入攻擊等功能,而這些的基石就在於將使用者發上來的sql語句進行解析。也就是我最頭大的詞法分析和語法分析。

到現在為止,我只是實現了乙個比較簡單的詞法分析器,用以將sql語句分解成多個token。而對於從token在進行語法分析,構建sql的ast,我現在還真沒啥經驗(編譯原理太差了),急需牛人幫忙。

所以,這裡只是簡單介紹一下mixer的詞法分析。

在很多地方,我們都需要進行詞法分析,通常會有幾種方式:

對於使用工具,我覺得有乙個不怎麼好的地方在於學習成本,譬如我用lex的時候就需要學習它的語法,同時通過工具生成的**可讀性都不怎麼好,**量大,更嚴重的是可能會比較慢。所以mysql自身也是自己實現乙個詞法分析模組。

而對於正規表示式,效能問題可能是乙個很需要考慮的,而且複雜度並不比使用類似lex這樣的工具低。

狀態機可能是我覺得自己動手實現詞法解析乙個很好的方式,對於sql的詞法解析,我覺得使用state machine的方式來自己寫乙個難度並不大,所以mixer自己實現了乙個。

通常,乙個狀態機的實現採用的是state + action + switch的做法,可能如下:

switch state
對於乙個state,我們通過switch知道它將會由哪乙個action進行處理,而對於每乙個action,我們則知道執行完成之後下乙個state是什麼。

對於上面的實現,如果state過多,可能會導致太多的case語句,我們可以通過state function進行簡化。

乙個state function就是執行當前的state action,並且直接返回下乙個state function。

我們可以這樣做:

type statefn func(*lexer) statefn

for state := startstate; state != nil

所以我們需要實現的就是每乙個state function以及對應的它的下乙個需要執行的state function。

mixer的詞法分析實現主要參考這個。主要實現在parser模組。

對於乙個lexer,需要提供的是nexttoken的功能,供外部獲取下乙個token,從而進行後續的操作(譬如語法分析)。

lexer的next token如下:

func (l *lexer) nexttoken() (token, error) , l.err

}l.state = l.state(l)

if l.err != nil , l.err}}

}}

tokens是乙個channel,每次state解析的token都會emit到這個channel上面,供nexttoken獲取,如果channel為空了,則再次呼叫state function。

可以看到,用go實現乙個詞法解析是很容易的事情,剩下的就是寫相應的state function用來解析sql。

mixer的詞法分析還有很多不完善的地方,譬如對於科學計數法數值的解析就不完善,後續準備參考mysql官方的詞法分析模組在好好完善一下。

mixer的**在這裡希望感興趣的童鞋共同完善。

詞法分析器

這是我自己的第一篇部落格,就分享一下最近才做完的編譯原理實驗,詞法分析器。本次實驗中我用mysql資料庫儲存自動機狀態表,這樣做的目的只是為了在後續的課設中可以繼續使用現在的 這一段 並不是太完善,發出來只是為了太完善。裡面還有很多問題,比如對字元和字串的識別,不知道為什麼資料庫無法將 和 轉換到我...

詞法分析器

include using namespace std const int maxn 1e3 10 int n 輸入文字的行數 char buffer maxn maxn 緩衝區 int len maxn 輸入文字每行的列數 struct out 輸出格式 out string a,int b re...

詞法分析器

簡單的詞法分析器 標題 南山荒野客 20 05 2019 詞法分析器 編譯原理 c 語言 include include includechar prog 80 token 6 char ch int syn,p,m 0,n,row,sum 0 int biaoji 0 char rwtab 18 ...