Atitit 发帖机系列(7) 词法分析的方法attilax大总结)
Atitit 發帖機系列(7) 詞法分析的方法attilax大總結)
?
1.1. 詞法分析貌似倆大方法,一個直接根據狀態圖轉換,一個根據dfa1
1.2. switchcase或者ifelse?最原始方法1
1.3. .??狀態表?比較實用2
1.4. ?使用NFA、DFA構建FSM(?專業方法,難度大)?DFA實際上就是高級版的狀態表2
1.5. 構建詞法分析器一般需要幾個步驟:2
1.5.1. 為正規式設計NFA??由正規式構造FA——Thompson法2
1.6. 優先遞歸 替換循環3
1.7. 狀態轉移表3
?
?
界面與后端通訊需要傳遞dsl,需要做詞法分析。。
?
1.1.?詞法分析貌似倆大方法,一個直接根據狀態圖轉換,一個根據dfa
?
?
簡單點兒說,詞法分析就是進行正則表達式匹配。詞法分析程序就是根據要匹配的正則表達式生成它的NFA或者DFA,再將待匹配的字符串放到這些NFA或者DFA中進行處理,從而分析出輸入字符串是否匹配給定的正則表達式
?
詞法分析器的任務是按照一定模式從源程序中識別出記號(token).
我們使用正規式描述這一模式,并通過有限自動機進行識別.
因為NFA對狀態轉移不加限制在實際應用中帶來很多問題, 通常我們將NFA轉換為等價的DFA. 這里所謂的自動機等價是指它們識別同樣的正規集.
?
?
1.2.?switchcase或者ifelse?最原始方法
?
這無意是最直觀的方式,使用一堆條件判斷,會編程的人都可以做到,對簡單小巧的狀態機來說最合適,但是毫無疑問,這樣的方式比較原始,對龐大的狀態機難以維護。
但checkStateChange()和performStateChange()這兩個函數本身依然會在面對很復雜的狀態機時,內部邏輯變得異常臃腫,甚至可能是難以實現。
在很長一段時期內,使用switch語?句一直是實現有限狀態機的唯一方法,甚至像編譯器這樣復雜的軟件系統,大部分也都直接采用這種實現方式。但?之后隨著狀態機應用的逐漸深入,構造出來的狀態?機越來越復雜,這種方法也開始面臨各種嚴峻的考驗,其中最令人頭痛的是如果狀態機中的狀態非常多,或者狀?態之間的轉換關系異常復雜,那么簡單地使用switch語句構造出來的狀態機將是不可維護的。
?
1.3.?.??狀態表?比較實用
?
1.4.??使用NFA、DFA構建FSM(?專業方法,難度大)?DFA實際上就是高級版的狀態表
使用DFA的方法完成的可配置詞法分析器的性能是相當好
一般來說,比較高性能的DFA的實現是一張二維的表。行代表字符,列代表DFA?的狀態,單元格代表該狀態經輸入某個字符之后進行轉移的目標狀態。此外還有一張表用來記錄哪些狀態對應哪些規則的結束狀態
?
1.5.?構建詞法分析器一般需要幾個步驟:
00001.?
用正規式描述記號的模式
00002.?
00003.?
1.5.1.?為正規式設計NFA??由正規式構造FA——Thompson法
?
00004.?
00005.?
將NFA轉換為等價的DFA, 這一步稱為確定化
00006.?
00007.?
優化DFA使其狀態數最少, 這一步稱為最小化
00008.?
?
1.6.?優先遞歸 替換循環
遞歸可讀性更好。。
?
?
1.7.?狀態轉移表
| cur_dbquo_stat | 當前狀態 | 當前字符 | 要即將轉換到的下一狀態 | ? |
| ? | ? | \ | ? | ? |
| ? | “??dbQuo_start | ‘ | <none> | ? |
| ? | Not sQuo start Not dbQuo_start | ‘ | sQuo ?start | ? |
| ? | sQuo start | ‘ | sQuo ?end | ? |
| Dbquo end or <non> Not Dbquo start | ? | “ | Dbquo start | ? |
| Dbquo start | ? | “ | Dbquo end | ? |
| ? | Non sQuo ?dbquo start | , | ? | ? |
| ? | ? | ? | ? | ? |
| ? | ? | ? | ? | ? |
字符串優先使用單引號,方便輸入。。
meth(\"select from tab where a='abc'\",'str2',\'s3\')
引號需要單獨的狀態表示
?
參考資料
atitit.自己動手開發編譯器and解釋器(1) ------詞法分析--attilax總結 - attilax的專欄 - 博客頻道 - CSDN.NET.html
詞法分析實戰 - booirror的博客 - 博客頻道 - CSDN.NET.html
現代編譯原理--第一章(詞法分析) - BlackWalnut - 博客園.html
?
作者::?綽號:老哇的爪子?(?全名::Attilax?Akbar?Al?Rapanui?阿提拉克斯?阿克巴?阿爾?拉帕努伊?)?
漢字名:艾提拉(艾龍),???EMAIL:1466519819@qq.com
轉載請注明來源:?http://www.cnblogs.com/attilax/
--Atiend
?
轉載于:https://www.cnblogs.com/attilax/p/6107896.html
總結
以上是生活随笔為你收集整理的Atitit 发帖机系列(7) 词法分析的方法attilax大总结)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 GDB 恢复堆栈信息
- 下一篇: dump 分析模式之 INCORRECT