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

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

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

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中均有类似如下的代码:

相关推荐