jcwang 2010-03-25
我们都知道在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中均有类似如下的代码: