詞法分析(lexical analysis):分析由字元組成的單詞是否合法,如果沒有問題的話,則產生乙個單詞流。
語法分析(syntactic analysis):分析由單詞組成的句子是否合法,如果沒有問題的話,則產生乙個語法樹。
在詞法分析器分析源**文字的時候,有乙個概念需要明確:
1.物理行:由回車字串行(在windows上是cr lf,在unix上是lf)結尾的字串行組成乙個物理行。
2.邏輯行:由乙個或者多個物理行組成,可以明確地使用反斜槓(\)來連線多個物理行使之成為乙個邏輯行;或者,處在圓括號,中括號,花括號內的表示式可以跨越多個物理行,但是被當作乙個邏輯行。
詞法分析器是面向邏輯行的,也就是說,對於詞法分析器而言,只有邏輯行才算是一行,它只在邏輯行結束之處才產生newline這個單詞或者說token。
對於每一處縮排,不管它有多少個空白字元,詞法分析器只會產生乙個indent單詞或者說token,代表縮排一級,每當要退出一級縮排的時候,詞法分析器就會產生乙個dedent單詞或者說token。注意,單詞dedent並沒有乙個或一組字元與之對應,它是完全的邏輯概念。
python使用稍作修改的bnf(巴科斯正規化)來表示詞法與語法規則。
下面重點說一下需要注意的地方,以避免發生一些低階但是隱蔽的程式設計錯誤。
1.識別符號是區分大小寫的,但是仍然不要僅僅用大小寫不同來區分兩個變數。
2.不要使用那些在其它程式語言中是關鍵字的識別符號作為變數名,因為它們很可能會成為python的關鍵字。
3.不要使用python明確宣告有特殊意義的標誌符作為變數名(這類變數一般以下劃線開頭),除非明確自己要使用那個特殊含義。
4.不要在python中使用$和?(字串中除外),它們不是合法的字元。
5.不要混用tab和空格來表示縮排,只使用其中一種,並養成習慣。
6.整數字面常量有10,16,8,2幾種表示方法,如果使用16進製制,請寫0xa或者0xa;如果使用8進製,請寫0o7或者0o7;如果使用2進製,請寫0b1或者0b1;總之,不要省略掉那個標識進製的字母,建議只使用小寫字母。
7.在整數字面常量後加乙個l或者l就形成了乙個長整數,建議只使用l,因為小寫l看起來像數字1.
8.整數使用32位表示,但是長整數並不限於多少位表示,在記憶體允許的情況下,它可以表示任意大小的整數,這與c語言等是不一樣的。
9.如果乙個整數字面常量的值超過32位整數的表示範圍,那麼python會自動將它公升級為長整數,但是在早期的python實現中可能並非如此,因此如果你預計需要乙個很大的整數值,請明確使用長整數。
10.浮點數字面常量只有10進製形式。
Python的詞法分析與語法分析
詞法分析 lexical analysis 分析由字元組成的單詞是否合法,如果沒有問題的話,則產生乙個單詞流。語法分析 syntactic analysis 分析由單詞組成的句子是否合法,如果沒有問題的話,則產生乙個語法樹。在詞法分析器分析源 文字的時候,有乙個概念需要明確 1.物理行 由回車字串行...
Python的詞法分析與語法分析
詞法分析 lexical analysis 分析由字元組成的單詞是否合法,如果沒有問題的話,則產生乙個單詞流。語法分析 syntactic analysis 分析由單詞組成的句子是否合法,如果沒有問題的話,則產生乙個語法樹。在詞法分析器分析源 文字的時候,有乙個概念需要明確 1.物理行 由回車字串行...
python表示式詞法分析 詞法分析器
前言 在這一系列文章中,我們將會使用python語言來實現pl0編譯器。首先我們來實現編譯器中的詞法分析的功能。我們使用正規表示式來對源程式的程式語句篩選為 關鍵字keywords,數字numbers,變數variables,分隔符separatores和運算子operatores五種類別。詞法分析...