用Python詞法分析Parser中tokenizer.h的實(shí)際應(yīng)用
如果你在對(duì)Python詞法分析的實(shí)際操作中,你對(duì)其有不解之處時(shí),你就可以點(diǎn)擊以下的文章對(duì)其進(jìn)行了解,希望你對(duì)相關(guān)Python詞法分析的實(shí)現(xiàn)在Parser目錄下的tokenizer.h和tokenizer.cpp的內(nèi)容有所了解。
在Python詞法分析的實(shí)現(xiàn)在Parser目錄下的tokenizer.h和tokenizer.cpp。Python的其他部分會(huì)直接調(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開(kāi)頭。這是Python源代碼中的一個(gè)約定。雖然Python是用C語(yǔ)言實(shí)現(xiàn)的,其實(shí)現(xiàn)方式借鑒了很多面對(duì)對(duì)象的思想。拿詞法分析來(lái)說(shuō),這四個(gè)函數(shù)均可以看作PyTokenizer的成員函數(shù)。頭兩個(gè)函數(shù)PyTokenizer_FromXXXX可以看作是構(gòu)造函數(shù),返回PyTokenizer的instance。
PyTokenizer對(duì)象內(nèi)部狀態(tài),也就是成員變量,儲(chǔ)存在tok_state之中。PyTokenizer_Free可以看作是析構(gòu)函數(shù),負(fù)責(zé)釋放PyTokenizer,也就是tok_state所占用的內(nèi)存。PyTokenizer_Get則是PyTokenizer的一個(gè)成員函數(shù),負(fù)責(zé)取得在字符流中下一個(gè)Token。
Python詞法分析中這兩個(gè)函數(shù)均需要傳入tok_state的指針,和C++中需要隱含傳入this指針給成員函數(shù)的道理是一致的。可以看到,OO的思想其實(shí)是和語(yǔ)言無(wú)關(guān)的,即使是C這樣的結(jié)構(gòu)化的語(yǔ)言,也可以寫(xiě)出面對(duì)對(duì)象的程序。
- tok_state
tok_state等價(jià)于PyTokenizer這個(gè)class本身的狀態(tài),也就是內(nèi)部的私有成員的集合。部分定義如下:
- /* Tokenizer state */
- struct tok_state {
- /* Input state; buf <= cur <= inp <= end */
- /* NB an entire line is held in the buffer */
- char *buf; /* Input buffer, or NULL; malloc'ed if
fp != NULL */- char *cur; /* Next character in buffer */
- char *inp; /* End of data in buffer */
- char *end; /* End of input buffer if buf != NULL */
- char *start; /* Start of current token if not NULL */
- int done; /* E_OK normally, E_EOF at EOF, otherwise
error code- /* NB If done != E_OK, cur must be == inp!!! */
- FILE *fp; /* Rest of input; NULL if tokenizing a
string */- int tabsize; /* Tab spacing */
- int indent; /* Current indentation index */
- int indstack[MAXINDENT]; /* Stack of indents */
- int atbol; /* Nonzero if at begin of new line */
- int pendin; /* Pending indents (if > 0) or dedents
(if < 0) */- char *prompt, *nextprompt; /* For interactive
prompting */- int lineno; /* Current line number */
- int level; /* () [] {} Parentheses nesting level */
- /* Used to allow free continuations inside them */
- };
最重要的是buf, cur, inp, end, start。這些field直接決定了緩沖區(qū)的內(nèi)容:
buf是緩沖區(qū)的開(kāi)始。假如PyTokenizer處于字符串模式,那么buf指向字符串本身,否則,指向文件讀入的緩沖區(qū)。cur指向緩沖區(qū)中下一個(gè)字符。inp指向緩沖區(qū)中有效數(shù)據(jù)的結(jié)束位置。PyTokenizer是以行為單位進(jìn)行處理的,每一行的內(nèi)容存入從buf到inp之間,包括\n。一般情況下 ,PyTokenizer會(huì)直接從緩沖區(qū)中取下一個(gè)字符,一旦到達(dá)inp所指向的位置,就會(huì)準(zhǔn)備取下一行。
當(dāng)PyTokenizer處于不同模式下面,具體的行為會(huì)稍有不同。end是緩沖區(qū)的結(jié)束,在字符串模式下沒(méi)有用到。start指向當(dāng)前token的開(kāi)始位置,如果現(xiàn)在還沒(méi)有開(kāi)始分析token,start為NULL。以上就是對(duì)在Python詞法分析的實(shí)現(xiàn)在Parser目錄下的tokenizer.h和tokenizer.cpp相關(guān)的內(nèi)容的介紹,忘你會(huì)有所收獲。
【編輯推薦】
- Python中文轉(zhuǎn)換url編碼的實(shí)際操作步驟介紹
- Python學(xué)習(xí)入門(mén)中的先搭環(huán)境的具體應(yīng)用的方法介紹
- Python源碼分析的實(shí)際相關(guān)操作步驟解析
- Python安裝的步驟操作其實(shí)是件很容易的事
- 對(duì)Python源代碼組織的相關(guān)實(shí)際操作步驟解析