Python的语法分析(一)
老铁们对不住,最近太忙了,恢复更新了
上次我们分析完了Python的词法分析部分,今天让我们进入下一个大的板块:Python的语法分析。
在进入语法分析前,我们首先要了解清楚语法分析的作用是什么。如果说词法分析是为了从纯文本中提取符合需求的token流的话,那么语法分析的作用就是通过这些token,构建一颗符合对应编程语言的文法定义的结构化数据-语法树。
因此,我们先从文法定义上着手分析。
文法定义
何为文法?个人看来,文法就是规定一个编程语言语法静态格式的描述。
比如,在某些语言里,我们定义一个整型变量int a = 100;;而在另一些语言中,可能需要var a:Int = 3
备注:我们这里不关注这两条语句的语义是否完全相同。
当编译器进行语法分析的时候,会尝试判断上述语句经过词法分析后它们是否符合特定的模式,然后把这些模式与函数调用,变量调用,数学运算之类的表达式关联起来。
上述语句中提及的模式,就是文法。
从本质上来说,不仅仅是语法分析中涉及了文法,词法分析中也存在文法。有大量语言的词法分析可以通过正则表达式进行表征解析,这种文法属于所谓的3型文法,即正则(规)文法。
而除了正则文法,还有其余三种文法,我们分别来介绍一下:
0型文法,最没有限制的文法。只要定义的集合中的非终结符有一个出现在推导式的左边,就可以。
1型文法(上下文有关文法),它在0型文法的基础之上,只添加了一个要求:右边的长度>=左边的长度(终结符或非终结符的个数)。
2型文法(上下文无关文法),它在1型文法的基础上,有增加了一个要求:左边必须是非终结符(个数不限)。
3型文法,它是在2型的基础上提出了要么一个非终结符推出一个终结符,要么一个非终结符推出一个终结符并且带一个非终结符。3型文法包含了左线性和右线性两种。
看来了定义,是不是很晦涩,我们来逐一剖析其中的困惑之处。
首先我们需要了解什么是终结符,什么是非终结符。假设我们现在有一门语言,支持int, char, float三种基本类型。
那么我们在词法分析的时候就会定义对应的TOKEN标示,诸如:INT,CHAR,FLOAT。而在解析语法的时候,我们会定义类似如下的结构:
-> INT | CHAR | FLOAT
其中,就是对三种类型的抽象描述。因此,其是一个非终结符。-> 表征为推导式,而INT, CHAR, FLOAT则分别独立表征为终结符。