第四单元 语法分析
作者:互联网
第四单元 语法分析
4.1 自顶向下分析概述
-
自顶向下的分析(Top-Down Parsing)
从树的顶部(根节点)向底部(叶节点)方向构造分析树
-
最左推导(Left-most Derivation)
在最左推导中,总是选择每个句型的最左非终结符进行替换
E => E + E => id + E => id + (E) => id + (E + E) => id + (id + E) => id + (id + id)
- 逆过程(自底向上的过程)叫做最右归约,从下往上看
-
最右推导(Right-most Derivation)
在最右推导中,总是选择每个句型的最右非终结符进行替换
E => E + E => E + (E) => E + (E + E) => E + (E + id) => E + (id + id) => id + (id + id)
- 逆过程(自底向上的过程)叫做最左归约,从下往上看
在自底向上的分析中,总是采用最左归约的方式,因此把最左归约成为规范归约, 而最右推导相应地称为规范推导
- 最左推导和最右推导的唯一性
在顶底向下的分析中,总是选择每个句型的最左非终结符进行替换,根据输入流中的下一个终结符,选择最左非终结符的一个候选式
-
自顶向下语法分析的通用形式
-
递归下降分析(Recursive-Descent Parsing)
- 由一组过程组成, 每个过程对应一个非终结符
- 从文法开始符号S对应的过程开始,递归调用文法中其它非终结符对应的过程。如果S对应的过程恰好扫描了整个输入串,则为完成语法分析
- 可能需要回溯,导致效率较低(尝试多个候选式)
-
预测分析(Predictive Parsing)
- 预测分析是递归下降分析技术的特例,通过在输入中向前看固定个数(通常是1)符号来选择正确的A-产生式
- 可以对某些文法构造出向前看k个输入符号的预测分析器,该类文法有时也称为LL(k)文法类
- 预测分析不需要回溯,是一种确定的自顶向下的分析方法
- 预测分析是递归下降分析技术的特例,通过在输入中向前看固定个数(通常是1)符号来选择正确的A-产生式
-
-
4.2 文法转换
例 1
文法G
S -> aAd | aBe
A -> c
B -> b
输入 a b c
↑
这时候S有多个候选式存在比如aAd或者aBe
上面的情况即同一非终结符的多个候选式存在共同前缀,将导致回溯现象
-
提取左公因子(Left Factoring) 来解决
文法G' S -> aS' S' -> Ad | Be A -> c B -> b
例2
文法G
E -> E + T | E - T | T
T -> T * F | T / F | F
F -> (E) | id
输入
id + id * id
↑
E => E + T
=> E + T + T
=> E + T + T + T
=> ...
含有A -> Aa形式产生式的文法称为是直接左递归的(immediate left recursive)
如果一个文法中有一个非终结符A使得对某个串a存在一个推导A=>+Aa,(+是A的左上角标), 那么这个文法就是左递归的
经过两步或者两步以上推导产生的左递归称为是间接左递归的
左递归文法会使递归下降分析器陷入无限循环
所以为了消除左递归
- 消除直接左递归
-
直接消除左递归
分析正则表达式,再替换右边,将左递归转换成为右递归
A -> Aα | β 正则表达式:γ = β α*(右上角标) ↡ A -> β  -> α | ε
-
消除直接左递归的一般形式
即多次利用上面的规则
A -> β1 |β2 |β3 |β4 |β5 |β6 |...
 -> α1 |α2 |α3 |...
代价:引进了一些非终结符和ε_产生式
-
消除间接左递归
利用上面的方法,找到将A与递归连接起来,再代入到间接递归式中即可
标签:文法,语法分析,推导,递归,id,最右,终结符,第四,单元 来源: https://www.cnblogs.com/hhc-blog/p/15457811.html