上篇講述了句型的兩種類型--自上而下和自下而上,本篇進入編譯程序的第一個工作階段--**詞法分析**。
我們在[第二篇](http://blog.csdn.net/lovesummerforever/article/details/9027461)中講述了關于詞法分析的簡單介紹,詞法分析工作可以獨立的一遍,把字符流的源程序變成單詞序列,輸出在一個中間文件上,這個文件作為下一個工作階段-詞法分析程序的輸入而繼續編譯的過程。
一般情況下降詞法程序設計成一個子程序,每當語法分析程序需要一個單詞的時候,則調用該子程序。詞法分析程序每得到一次調用,便從源程序文件中讀入一些字符,直到識別出一個單詞。
**那經過第一階段的加工,我們的詞法分析之后,得到什么?**
詞法分析的輸出:讀入源程序,輸出單詞符號,單詞符號包括單詞的中類和單詞自身的值,例如關鍵字有 end if 、while、var等;運算符有+ ,*,《=等。
**又有一個問題了,為什么要有這個階段,將詞法分析這個工作分為一個階段?為什么將編譯過程分為詞法分析和語法分析?**
筆者認為這就和三層架構一樣,系統為什么要分為三層架構?其實這也和我們的生活有關,現代社會不再單靠一個人單打獨斗的社會,我們當代的社會人們分工明確,各司其職,社會穩步發展~ 這樣提高全社會運轉效率。我們的編譯程序也是,主要原因有一下三點:
1、使整個編譯程序的結構更加簡潔、清晰和條理化。
2、編譯程序的效率會改進。
3、增強了編譯程序的可移植性。
**詞法分析開始**:
詞法分析開始,第一步當然是要從源程序中讀入單詞了,我們在文法中描述單詞的工具是什么?正規式(也稱正則表達式),是用以描述單詞符號的方便工具。
**正規式和正規集定義**:

字母表集合內,所含有兩個相繼的a或兩個相繼的b組成的串 |
**正規式服從代數規律**:
~~~
????????????1)r|s = s|r
???????????? 2)r|(s|t) = (r|s)|t
???????????? 3)(rs)t = r(st)
?????????????4)r(s|t)r = sr|tr
?????????????5)**ε**r = r?????????? r**ε**= r
???????????? 6)r|r = r
~~~
**正規文法和正規式的轉換:**

**例如:**
??????? 將r = a(a|d)* 轉換為相應的正規文法。
??????? S->a(a|d)*??==>? S->aA? A->(a|d)* ==>A->(a|d)B? A->**ε** ==>B->(a|d)B? B->**ε**
**轉換結果為:S->aA A->(a|d)B A->**ε** B->(a|d)B? B->ε**
**單詞的識別工具--正規式,本篇講述到這里,下一篇講述正規式的識別裝置--有窮自動機。**
**愿開心閱讀O(∩_∩)O~~**