您好,登錄后才能下訂單哦!
Parser中tokenizer.h如何使用,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(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語言實現(xiàn)的,其實現(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ù),負責(zé)釋放PyTokenizer,也就是tok_state所占用的內(nèi)存。PyTokenizer_Get則是PyTokenizer的一個成員函數(shù),負責(zé)取得在字符流中下一個Token。
Python詞法分析中這兩個函數(shù)均需要傳入tok_state的指針,和C++中需要隱含傳入this指針給成員函數(shù)的道理是一致的??梢钥吹剑琌O的思想其實是和語言無關(guān)的,即使是C這樣的結(jié)構(gòu)化的語言,也可以寫出面對對象的程序。
tok_state
tok_state等價于PyTokenizer這個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ū)的開始。假如PyTokenizer處于字符串模式,那么buf指向字符串本身,否則,指向文件讀入的緩沖區(qū)。cur指向緩沖區(qū)中下一個字符。inp指向緩沖區(qū)中有效數(shù)據(jù)的結(jié)束位置。PyTokenizer是以行為單位進行處理的,每一行的內(nèi)容存入從buf到inp之間,包括\n。一般情況下 ,PyTokenizer會直接從緩沖區(qū)中取下一個字符,一旦到達inp所指向的位置,就會準備取下一行。
當(dāng)PyTokenizer處于不同模式下面,具體的行為會稍有不同。end是緩沖區(qū)的結(jié)束,在字符串模式下沒有用到。start指向當(dāng)前token的開始位置,如果現(xiàn)在還沒有開始分析token,start為NULL。以上就是對在Python詞法分析的實現(xiàn)在Parser目錄下的tokenizer.h和tokenizer.cpp相關(guān)的內(nèi)容的介紹,忘你會有所收獲。
看完上述內(nèi)容,你們掌握Parser中tokenizer.h如何使用的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。