Python运行的过程中不直接用到的相关函数的介绍

开发 后端
在Python运行的过程中往往会依靠graminit.c/graminit.h里的相关数据结构还有不直接用到的相关函数而进行相关的语法分析,例如以下的文章的相关介绍。

我们都知道在Python运行的过程中是需要不直接的利用到Grammar文件的相关内容进而进行相关的语法分析,那么如果你对Python运行的实际操作感兴趣的话,你就可以浏览我们的文章对其有一个更好的了解。过程中会依赖graminit.c/graminit.h中的数据结构来进行语法分析

前面提到了在Python的源代码目录下面有一个Grammar目录,里面只有一个文件Grammar,以BNF的语法定义了Python的全部语法。拿if语句举例来说:

  1. if_stmt: 'if' test ':' suite 
    ('elif' test ':' suite)* ['else' ':' suite] 

上面的语句可以这样理解,if语句是if关键字+逻辑表达式+ ‘:’+语句块(suite)后面跟上0至多个elif语句并以else语句结束。在最左边的if_stmt表示这一句话定义了if_stmt(非终结符),’:’右边则是if_stmt的具体对应的内容。

1. ‘’引号中的内容是实际的字符串,’if’就代表if这两个字符

2. 一般的标示符代表着非终结符,也就是某个等式的左边,if_stmt, test, suite都是非终结符,可以被扩展为等式右边的序列。

3. ()括号是原子操作符,被括号括起来的被作为单个表达式看待

4. *代表0或多个,比如在if_stmt中的(‘elif’ test ‘:’ suite)*代表一个if语句中可以有0或者多个elif子句

5. +代表1或者多个

但是,这个文件并不只是用来作为参考资料的。实际上,Python运行的时候也需要间接利用到Grammar文件的内容来进行语法分析。

 Python PGEN

在Makefile.pre.in和Parser/grammar.mak中均有类似如下的代码:

 

  1. ###################################################
    #######################  
  2. # Grammar  
  3. GRAMMAR_H= $(srcdir)/Include/graminit.h  
  4. GRAMMAR_C= $(srcdir)/Python/graminit.c  
  5. GRAMMAR_INPUT= $(srcdir)/Grammar/Grammar  
  6. ###############################################
    ###########################  
  7. # Parser  
  8. PGENParser/pgen$(EXE)  
  9. POBJS= \  
  10. Parser/acceler.o \  
  11. Parser/grammar1.o \  
  12. Parser/listnode.o \  
  13. Parser/node.o \  
  14. Parser/parser.o \  
  15. Parser/parsetok.o \  
  16. Parser/bitset.o \  
  17. Parser/metagrammar.o \  
  18. Parser/firstsets.o \  
  19. Parser/grammar.o \  
  20. Parser/pgen.o  
  21. PARSER_OBJS= $(POBJS) Parser/myreadline.o Parser/tokenizer.o  
  22. PGOBJS= \  
  23. Objects/obmalloc.o \  
  24. Python/mysnprintf.o \  
  25. Parser/tokenizer_pgen.o \  
  26. Parser/printgrammar.o \  
  27. Parser/pgenmain.o  
  28. PGENOBJS= $(PGENMAIN) $(POBJS) $(PGOBJS)  
  29. ###################################################
    #########################  
  30. # Special rules for object files  
  31. $(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)  
  32. -$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)  
  33. $(PGEN): $(PGENOBJS)  
  34. $(CC) $(OPT) $(LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)  

 

这段代码负责生成pgen,然后调用pgen以Grammar作为输入,生成graminit.h/graminit.c。PGEN是Python自带的语法分析数据生成的工具,负责分析Grammar然后生成对应的graminit.c/graminit.h。然后,Python运行过程中会依赖graminit.c/graminit.h中的数据结构来进行语法分析。PGEN的具体实现不在本文讨论范围中,从略。

 

 

【编辑推荐】

  1. 对Python源代码组织的相关实际操作步骤解析
  2. Python安装的步骤操作其实是件很容易的事
  3. Python源码分析的实际相关操作步骤解析
  4. Python unicode ascii编码在windows中的实际应用
  5. Python语言中常用的四种工具的介绍
责任编辑:佚名 来源: 互联网
相关推荐

2010-03-15 09:11:25

Python编程版面

2010-05-27 17:45:13

MySQL存储过程

2010-04-16 11:39:56

Oracle存储过程

2010-01-04 18:25:24

Ubuntu Auda

2010-03-19 13:57:30

Python字符串处理

2010-10-09 15:07:35

MySQL日期

2010-03-19 14:44:30

Python模块级函数

2010-03-19 18:36:39

python开发环境

2010-03-25 14:27:52

Python语法

2018-12-06 08:50:37

zk集群服务器选举

2009-07-23 14:10:38

Hibernate J

2011-05-03 10:31:59

喷墨打印机注墨误区

2013-08-15 12:26:40

阿里云飞天

2010-07-01 14:05:43

SNMPMIB

2011-04-11 17:28:50

oracle存储select语句

2010-03-25 14:43:04

Python运行

2010-06-04 17:43:12

Hadoop集群搭建

2009-11-26 10:23:17

2010-03-30 13:19:57

Oracle存储

2010-01-04 15:27:45

Silverlight
点赞
收藏

51CTO技术栈公众号