Python程序執(zhí)行的第一個步驟的詳細(xì)介紹
我們大家都知道的是Python程序執(zhí)行可分為5個步驟,那么本文將介紹Python程序執(zhí)行的第一個步驟,也就是我們所說的詞法分析,如果你對Python程序執(zhí)行的第一個步驟感興趣的話,你就可以點(diǎn)擊以下的文章。
Python源碼分析3 – 詞法分析器PyTokenizer 收藏
Introduction
上次我們分析了Python程序執(zhí)行可分為5個步驟:
Tokenizer進(jìn)行詞法分析,把源程序分解為Token
Parser根據(jù)Token創(chuàng)建CST
CST被轉(zhuǎn)換為AST
AST被編譯為字節(jié)碼
執(zhí)行字節(jié)碼
本文將介紹Python程序執(zhí)行的第一步,也就是詞法分析。
詞法分析簡單來說就是把源程序的字符分解組合成Token。
比如sum=0可以分解成3個token,'sum', '=', '0'。程序中的whitespace通常只作為分隔符用,最終會被忽略掉,因此沒有出現(xiàn)在token的列表中。不過在Python之中,由于語法規(guī)則的關(guān)系,Tab/Space需要用來分析程序的縮進(jìn),因此Python中對于Whitespace的處理比一般C/C++編譯器的處理會要稍微復(fù)雜一些。
在Python中詞法分析的實(shí)現(xiàn)在Parser目錄下的tokenizer.h和tokenizer.cpp。Python的其他部分會直接調(diào)用tokenizer.h中定義的函數(shù),如下:
- extern struct tok_state
*PyTokenizer_FromString
(const char *);- extern struct tok_state
*PyTokenizer_FromFile
(FILE *, char *, char *);- extern void PyTokenizer_Free
(struct tok_state *);- extern int PyTokenizer_Get
(struct tok_state *, char **, char **);
這些函數(shù)均以PyTokenizer開頭。這是Python源代碼中的一個約定。雖然Python是用C語言實(shí)現(xiàn)的,其實(shí)現(xiàn)方式借鑒了很多面對對象的思想。拿詞法分析來說,這四個函數(shù)均可以看作PyTokenizer的成員函數(shù)。
頭兩個函數(shù)PyTokenizer_FromXXXX可以看作是構(gòu)造函數(shù),返回PyTokenizer的instance。PyTokenizer對象內(nèi)部狀態(tài),也就是成員變量,儲存在tok_state之中。PyTokenizer_Free可以看作是析構(gòu)函數(shù),負(fù)責(zé)釋放PyTokenizer,也就是tok_state所占用的內(nèi)存。
PyTokenizer_Get則是PyTokenizer的一個成員函數(shù),負(fù)責(zé)取得在字符流中下一個Token。這兩個函數(shù)均需要傳入tok_state的指針,和C++中需要隱含傳入this指針給成員函數(shù)的道理是一致的??梢钥吹?,OO的思想其實(shí)是和語言無關(guān)的,即使是C這樣的結(jié)構(gòu)化的語言,也可以寫出面對對象的程序。
以上就是Python程序執(zhí)行的第一步,也就是詞法分析相關(guān)的內(nèi)容的介紹,忘你會有所收獲。
【編輯推薦】