學完詞法分析,有點亂,稍微整理下整個過程
下面我們都是以c語言為例,
我們首先明確詞法分析要做的是什麼,詞法分析是將字元流轉化為記號流,同時判斷該字元流是否合法。字元流就是一行行的**,如if(a > 10), a++, while(true)等等,記號流就是程式設計師所定義的資料結構,比如說對於if(a > 10)這樣一行**,可以分解成下列的資料結構:
struct node ; struct node //lparen表示左括號; struct node //表示乙個變數,等等,也就是詞法分析所做的任務就是將這麼一行**變成這些資料結構,即**是作為詞法分析的輸入,資料結構作為詞法分析的輸出(當然這struct不一定這麼定義,還有可能加入其它元素,如行號之類的)。
所以我們的任務就變成要做出乙個詞法分析器。
那麼這個詞法分析器應該怎樣做才使得它可以接受一行**後可以輸出這麼些資料機構呢。有兩種方法。
第一種是手工寫,就是對於一種特定的語言,我們手工敲**根據該語言規則來模擬出這個轉化過程,這種方法雖然複雜,並且容易出錯,但這樣對詞法分析各個部分都有比較精確的控制,這樣效率可能會比較高。gcc4.0後是使用這種方法
第二種方法是使用詞法分析器的生成器,也就是自動生成這個詞法分析器,**較小,但較難控制細節,要做優化比較困難。什麼叫自動生成乙個詞法分析器,過程就是:宣告式的規範---->自動生成----->詞法分析器,這裡自動生成是乙個工具(也就是一段**),那麼它所接受的輸入是宣告式的規範,輸出是乙個詞法分析,我們先來看下輸入宣告式規範,宣告式規範的意思是我們只需寫出識別字元流的規則是什麼,不需要指出怎麼識別,然後放進自動生成器就行了,那麼這個宣告式的規範是什麼?它就是我們所學的正規表示式,我們所學的c語言的關鍵字,識別符號,整數都是正規表示式,也就是說我們將這些正規表示式放進自動生成器,那麼就會生成詞法分析器,這個詞法分析器就是dfa,確定狀態有限自動機。那麼很明顯這個自動生成器整個過程實際上是正規表示式轉化為非確定的有限狀態自動機(nfa),最後非確定的有限狀態自動機轉化為確定狀態有限自動機,然後通過dfa的最小化,就生成了最後的dfa,也就是我們的輸出詞法分析器。如果輸入的**可以被有限自動機所接受,那麼將會進入語法分析的階段(做過acm的同學可能會比較好理解這個接受的概念,類似於在乙個字典樹詢問乙個串是否存在,但這裡概念更加廣泛)
整個詞法分析的過程就這樣整理好了。
其中我們可以看到這個過程,我們首先按照對乙個大工程的輸入輸出作分析,然後把輸入和輸出分別作為乙個工程,去看他們的輸入輸出,也就是乙個遞迴的思想,通過這樣的思想,我們往往可以把乙個很複雜的演算法整理清楚,這也是上密碼學時老師經常和我們強調看演算法的過程和步驟。也是我們平時所說的自頂向下分析。(測試一般是自底向上測試)同時這個過程,也看到了數學,資料結構,演算法強大的威力,他們相互融合後能發揮出巨大的效果,深深被計算機科學家們折服
關於MongoDB的一點總結
今天推送引擎註冊在dubbo上的服務總是自動會關閉掉,查了一下發現是system.in.read 的原因,導致自動關閉。但是還是不太明白,別人執行spring的時候,只要啟動以後就不會自動關閉,而我的spring剛啟動就關閉了,找了半天都沒有解決,沒辦法,只好用了最笨的方法 while true 而...
關於演算法的一點總結
分解問題的角度 fix 某一維度,嘗試另一維度上的所有可能 a.可能是array的 i,j pointers,b.可能是矩形的長與寬,c.可能是tree的每乙個subtree,d.可能是情景題的每一對pair 求所有解的,暴力上backtracking吧 如果問最短 最少的,先想bfs dp這對好 ...
關於多執行緒的一點總結
昨天又在toplanguage上看到一些關於輕量級執行緒的討論,於是對其中很有用的一段話轉過來 記錄下來以供自己日後慢慢研究。下面是由red.gmail.com發表在toplanguage上的 1.process per connection thread per connection 這在連線數不...