中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Parser中tokenizer.h如何使用

發布時間:2021-07-20 14:05:47 來源:億速云 閱讀:193 作者:Leah 欄目:編程語言

Parser中tokenizer.h如何使用,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

在Parser目錄下的tokenizer.h和tokenizer.cpp。Python的其他部分會直接調用tokenizer.h中定義的函數,如下:

  1. extern struct tok_state *PyTokenizer_FromString
    (const char *);   

  2. extern struct tok_state *PyTokenizer_FromFile
    (FILE *, char *, char *);   

  3. extern void PyTokenizer_Free(struct tok_state *);   

  4. extern int PyTokenizer_Get(struct tok_state *,
     char **, char **); 

這些函數均以PyTokenizer開頭。這是Python源代碼中的一個約定。雖然Python是用C語言實現的,其實現方式借鑒了很多面對對象的思想。拿詞法分析來說,這四個函數均可以看作PyTokenizer的成員函數。頭兩個函數PyTokenizer_FromXXXX可以看作是構造函數,返回PyTokenizer的instance。

PyTokenizer對象內部狀態,也就是成員變量,儲存在tok_state之中。PyTokenizer_Free可以看作是析構函數,負責釋放PyTokenizer,也就是tok_state所占用的內存。PyTokenizer_Get則是PyTokenizer的一個成員函數,負責取得在字符流中下一個Token。

Python詞法分析中這兩個函數均需要傳入tok_state的指針,和C++中需要隱含傳入this指針給成員函數的道理是一致的。可以看到,OO的思想其實是和語言無關的,即使是C這樣的結構化的語言,也可以寫出面對對象的程序。

tok_state

tok_state等價于PyTokenizer這個class本身的狀態,也就是內部的私有成員的集合。部分定義如下:

  1. /* Tokenizer state */   

  2. struct tok_state {   

  3. /* Input state; buf <= cur <= inp <= end */   

  4. /* NB an entire line is held in the buffer */   

  5. char *buf; /* Input buffer, or NULL; malloc'ed if 
    fp != NULL */   

  6. char *cur; /* Next character in buffer */   

  7. char *inp; /* End of data in buffer */   

  8. char *end; /* End of input buffer if buf != NULL */   

  9. char *start; /* Start of current token if not NULL */   

  10. int done; /* E_OK normally, E_EOF at EOF, otherwise 
    error code   

  11. /* NB If done != E_OK, cur must be == inp!!! */   

  12. FILE *fp; /* Rest of input; NULL if tokenizing a 
    string */   

  13. int tabsize; /* Tab spacing */   

  14. int indent; /* Current indentation index */   

  15. int indstack[MAXINDENT]; /* Stack of indents */   

  16. int atbol; /* Nonzero if at begin of new line */   

  17. int pendin; /* Pending indents (if > 0) or dedents 
    (if < 0) */   

  18. char *prompt, *nextprompt; /* For interactive 
    prompting */   

  19. int lineno; /* Current line number */   

  20. int level; /* () [] {} Parentheses nesting level */   

  21. /* Used to allow free continuations inside them */   

  22. }; 

最重要的是buf, cur, inp, end, start。這些field直接決定了緩沖區的內容:

buf是緩沖區的開始。假如PyTokenizer處于字符串模式,那么buf指向字符串本身,否則,指向文件讀入的緩沖區。cur指向緩沖區中下一個字符。inp指向緩沖區中有效數據的結束位置。PyTokenizer是以行為單位進行處理的,每一行的內容存入從buf到inp之間,包括\n。一般情況下 ,PyTokenizer會直接從緩沖區中取下一個字符,一旦到達inp所指向的位置,就會準備取下一行。

當PyTokenizer處于不同模式下面,具體的行為會稍有不同。end是緩沖區的結束,在字符串模式下沒有用到。start指向當前token的開始位置,如果現在還沒有開始分析token,start為NULL。以上就是對在Python詞法分析的實現在Parser目錄下的tokenizer.h和tokenizer.cpp相關的內容的介紹,忘你會有所收獲。

看完上述內容,你們掌握Parser中tokenizer.h如何使用的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

贵溪市| 丰台区| 阜新| 定襄县| 鄂伦春自治旗| 房产| 汉阴县| 南和县| 谷城县| 磐石市| 兴宁市| 固安县| 视频| 顺义区| 陆丰市| 洮南市| 志丹县| 南宁市| 长沙县| 扶风县| 澄城县| 宁津县| 宜春市| 松原市| 周口市| 喀喇沁旗| 时尚| 色达县| 新乡县| 客服| 万全县| 金阳县| 陆川县| 万载县| 资讯| 楚雄市| 辛集市| 南城县| 昂仁县| 庄河市| 华容县|