重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

Parser中tokenizer.h如何使用

Parser中tokenizer.h如何使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

创新互联建站是专业的金昌网站建设公司,金昌接单;提供成都做网站、网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行金昌网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

在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如何使用的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!


名称栏目:Parser中tokenizer.h如何使用
当前链接:http://cqcxhl.com/article/ijogej.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP