语法分析器
语法分析
语法分析器处理来自词法分析器的单词流,其职责是识别语法,确定被编译的程序是不是程序设计语言的语法模型中的一个有效语句。语法模型又一个形式语法G来表示,若单词串s属于G中定义的语言,则说G可以推导出s。
而语法分析器中:找到G中生成s的一个推导 的过程称为语法分析
|| 语法分析算法的两种通用类型
自顶向上的语法分析器试图通过(在各个单词上)预测下一个单词,依照语法的产生式来匹配输入流。这种算法,对于有限的语法而言高效精确
自底向上的语法分析器从底层(实际的单词序列)开始,不断积累上下文信息,直至出现显然的推导为止。
|| 语法的表示:
正则表达式往往不具有完整描述语法的能力(描述较短的词使用),我们通常用上下文无关语法(CFG)的形式来表示程序设计语言的语法
上下文无关语法
|| CFG中的概念:
- G是一组规则,描述了语句是如何形成的。可以从G导出的语句集成为G定义的语言,记作L(G)
- CFG定义的所有语言的集合,叫做上下文无关语言的集合
- 非终结符和终结符:CFG中语法变量称为非终结符(用于向语言添加结构和抽象)每一个单词都是一个终结符
这里的SheepNoise为语法变量
- 产生式:CFG中的每个规则都都称为一个产生式
- 产生式中的目标符号和起始符号:目标符号表示L(产生式)中所有符号串的的集合,因此目标符号只能是用于向语言添加结构和抽象的非终结符,而非某个单词即终结符
|| CFG推导的过程(即重写)
在推导中,我们根据一个语法规则a—>b(产生式),将原型符号串中的a重写为b。重复这个重写过程,直到原型符号中不再包含非终结符为止。
总结:推导就是将所有非终结符重写为终结符的过程,它从语法的起始符号开始,结束域语言中的一个语句
ps: 符号串处于推导中的某一个有效推导过程步骤时,称之为句型。最后符号串被重写称只包含终结符时,该符号串变成L(SN)中的一个语句
ps:推导可以分为最右推导 和 最左推导。最右推导,在每一个步骤都重写最右侧的非终结符
|| CFG的形式化
形式上CFG是一个四元组 (T, NY, S, P),各分量的解释如下:
- T — 是终结符或者L(G)中单词的集合
- NT — 是G的产生式中出现的非终结符的集合。
- S — 是语法指定的目标符号或者起始符号
- P — 是G中产生式或重写规则的集合
|| 语法分析树表示CFG推导过程的树称为语法分析树 / 语法树
可以看到语法树只表明其使用了哪些规则,并不能说明顺序。
|| 二义性:
如果某个语句有一个以上最左(或最右)推导,那么语法G就是二义性;
未完。。。