4hh第5章 自顶向下语法分析方法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
G[S]: S→Qc | c | Rc | Sc Q→Rb | b | Sb | Qb R→Sa | a | Qa | Ra
(2) 回溯的消除
要消除回溯, 首先要清楚回溯存在的 原因, 根除了这些原因, 自然就消除 了回溯。
假设用产生式A→1|2|…|n去执行 匹配任务, 而A面临的输入串为 a1a2…am。
(1) 左递归的消除
直接左递归的消除:
方法: 引入一个新非终结符, 把含有左 递归的产生式改写为右递归形式。
考虑产生式: A→A | 其中,是任意串且不以A开头.
A的产生式可改写为: A→A' A'→A'|
例如, 算术表达式文法G[E]为: G[E]: E→E+T | T T→T*F | F F→(E) | i
(2)对非终结符的不同排序会导致文 法形式上的不同, 但它们等价。
上例中, 若排序为S,Q,R, 则得到文法G'''[S]:
S→Qc | c Q→Rb | b R→bcaR' |caR' |aR' R'→bcaR' |
下面证明: G[S]与G[S]等价。
G[S]与G[S]等价的证明:
S…abc(abc)* | bc(abc)* | c(abc)* L(G)={(abc|bc|c)(abc)i | i≥0}
例如, G[S]: S→Qc | c
Q→Rb | b
R→Sa | a
(1) 将非终结符排序为R, Q, S; (2) 对于R (i=1, P1)
内层循环不执行; 消除R的直接左递归: R→Sa|a 对于Q (i=2, P2) 内层循环改写: Q→Sab|ab|b 消除Q的直接左递归:
Q→Sab|ab|b
A→1A' | 2A' |…| nA' A'→1A' | 2A' |…|mA' |
例如 消除E→E+T|E−T|T的左递归
解: 消除左递归后变为 E→TE' E'→+TE' | −TE' |
间接左递归的消除
考虑G[S]: S→Qc | c Q→Rb | b R→Sa | a
间接左递归的存在是由于非终结符 之间形成了循环推导, 只要把循环 推导中的某个连接切断, 间接左递 归就消除了。
Step2. 对其余n-1个产生式中的某 一个进行至多n-2次替换, 再消除其 直接左递归。 …
考虑后两个产生式: Q→Rb | b R→Sa | a
若后两个产生式改为: Q→Rb | b
R→Sa | a | Qa 则还需消除Q,R之间的连接:
Q Rb|b Sab|ab|Qab|b 再消除其直接左递归。
2. 确定的自上而下分析
为了实现确定的自上而下分析, 要求 文法满足下述条件:
(1)文法不含左递归。 左递归: A→A 或 A + A
左递归的存在使自上而下分析过 程陷入无限循环, 因此, 使用自上 而下分析法必须消除左递归。
(2) 分析过程无回溯
回溯的存在可能使已做的大量分析 工作推倒重来, 这会严重影响效率, 因此, 使用自上而下分析法必须消 除回溯。
消除左递归算法:
(1) 文法所有非终结符排序为A1,…,An; (2) 把间接左递归改为直接左递归, 并
消除之, 方法如下:
for (i=1; i<=n; i++)
{for (j=1; j<=i−1; j++) 把Ai→Aj|及Aj→1|…|k 改写为Ai→1|…|k|;
消除Ai的直接左递归; } (3) 化简, 删去不可达元的产生式。
切断循环推导中某个连接的方法:
Step1. 对n个产生式中的某一个进 行至多n-1次替换, 使间接左递归变 成直接左递归, 再消除之。
例如, 消除G[S]中S,Q之间的连接: S Qc|c Rbc|bc|c Sabc|abc|bc|c 改写为: S→abcS'|bcS'|cS'
S'→abcS'|
回溯的存在是由于分析过程中需 对多个候选式进行试探性匹配。
若能根据输入符从A的多个候选式 中选出一个作为全权代表, 使得若 该候选式与输入串匹配成功, 则A 与输入串匹配成功, 否则A与输入 串匹配不成功, 则可消除试探性匹 配, 从而消除回溯。
S…bca(bca)*bc | ca(bca)*bc | a(bca)*bc | bc|c
L(G)={(abc|bc|c)(abc)i | i≥0}
有兴趣的同学课后以下述文法为 例熟悉消除左递归的执行过程:
G[S]: S→Qc | c | Rc Q→Rb | b | Sb R→Sa | a | Qa
第5章 自顶向下语法分析方法
语法分析是编译过程的核心部分, 其 基本任务是在词法分析识别出单词 符号串的基础上, 分析判断程序的语 法结构是否符合语法规则。
1. 自上而下分析的不确定性
对于文法G[S]: S→xAy A→ab | a
ห้องสมุดไป่ตู้
考虑输入串为xay, 其分析过程如下:
S
S
xAy xAy
a
b
a
在上述分析过程中, 若有多个候选 式可供选择, 则需逐一试探每个候 选式。当试探失败时, 必须回溯到 该试探的初始现场, 包括注销已生 长子树、输入串指针回退到试探 前状态。这种带回溯的自上而下 分析法是一种穷举法, 效率很低。
(3) 化简, 删去关于Q和R的产生式: S→abcS' | bcS' | cS' S'→abcS' |
对消除左递归算法的两点说明:
(1)消除左递归算法有两个限制条件: 文法中不含回路和-生成式。
该限制不影响消除左递归算法的 使用, 因为对任一CFG G, 存在一 个不含-生成式和单一生成式的 CFG G', 使得L(G')=L(G)-{}。
对于S (i=3, P3) 内层循环改写:
S→Sabc | abc | bc | c 消除S的直接左递归:
S→abcS' | bcS' | cS'
S'→abcS' |
于是得文法G'[S]: S→abcS' | bcS' | cS' S'→abcS' | Q→Sab | ab | b R→Sa | a
消去直接左递归后得到文法G'[E]:
G'[E]: E→ TE'
E'→ +TE' |
T→ FT'
T'→*FT' |
F→(E) | i
一般地, 设文法中A的产生式为:
A→A1|A2|…|Am| 1|2|…|n 其中, 每个都不等于
每个都不以A开头
消除A的直接左递归, 文法可改写为:
(2) 回溯的消除
要消除回溯, 首先要清楚回溯存在的 原因, 根除了这些原因, 自然就消除 了回溯。
假设用产生式A→1|2|…|n去执行 匹配任务, 而A面临的输入串为 a1a2…am。
(1) 左递归的消除
直接左递归的消除:
方法: 引入一个新非终结符, 把含有左 递归的产生式改写为右递归形式。
考虑产生式: A→A | 其中,是任意串且不以A开头.
A的产生式可改写为: A→A' A'→A'|
例如, 算术表达式文法G[E]为: G[E]: E→E+T | T T→T*F | F F→(E) | i
(2)对非终结符的不同排序会导致文 法形式上的不同, 但它们等价。
上例中, 若排序为S,Q,R, 则得到文法G'''[S]:
S→Qc | c Q→Rb | b R→bcaR' |caR' |aR' R'→bcaR' |
下面证明: G[S]与G[S]等价。
G[S]与G[S]等价的证明:
S…abc(abc)* | bc(abc)* | c(abc)* L(G)={(abc|bc|c)(abc)i | i≥0}
例如, G[S]: S→Qc | c
Q→Rb | b
R→Sa | a
(1) 将非终结符排序为R, Q, S; (2) 对于R (i=1, P1)
内层循环不执行; 消除R的直接左递归: R→Sa|a 对于Q (i=2, P2) 内层循环改写: Q→Sab|ab|b 消除Q的直接左递归:
Q→Sab|ab|b
A→1A' | 2A' |…| nA' A'→1A' | 2A' |…|mA' |
例如 消除E→E+T|E−T|T的左递归
解: 消除左递归后变为 E→TE' E'→+TE' | −TE' |
间接左递归的消除
考虑G[S]: S→Qc | c Q→Rb | b R→Sa | a
间接左递归的存在是由于非终结符 之间形成了循环推导, 只要把循环 推导中的某个连接切断, 间接左递 归就消除了。
Step2. 对其余n-1个产生式中的某 一个进行至多n-2次替换, 再消除其 直接左递归。 …
考虑后两个产生式: Q→Rb | b R→Sa | a
若后两个产生式改为: Q→Rb | b
R→Sa | a | Qa 则还需消除Q,R之间的连接:
Q Rb|b Sab|ab|Qab|b 再消除其直接左递归。
2. 确定的自上而下分析
为了实现确定的自上而下分析, 要求 文法满足下述条件:
(1)文法不含左递归。 左递归: A→A 或 A + A
左递归的存在使自上而下分析过 程陷入无限循环, 因此, 使用自上 而下分析法必须消除左递归。
(2) 分析过程无回溯
回溯的存在可能使已做的大量分析 工作推倒重来, 这会严重影响效率, 因此, 使用自上而下分析法必须消 除回溯。
消除左递归算法:
(1) 文法所有非终结符排序为A1,…,An; (2) 把间接左递归改为直接左递归, 并
消除之, 方法如下:
for (i=1; i<=n; i++)
{for (j=1; j<=i−1; j++) 把Ai→Aj|及Aj→1|…|k 改写为Ai→1|…|k|;
消除Ai的直接左递归; } (3) 化简, 删去不可达元的产生式。
切断循环推导中某个连接的方法:
Step1. 对n个产生式中的某一个进 行至多n-1次替换, 使间接左递归变 成直接左递归, 再消除之。
例如, 消除G[S]中S,Q之间的连接: S Qc|c Rbc|bc|c Sabc|abc|bc|c 改写为: S→abcS'|bcS'|cS'
S'→abcS'|
回溯的存在是由于分析过程中需 对多个候选式进行试探性匹配。
若能根据输入符从A的多个候选式 中选出一个作为全权代表, 使得若 该候选式与输入串匹配成功, 则A 与输入串匹配成功, 否则A与输入 串匹配不成功, 则可消除试探性匹 配, 从而消除回溯。
S…bca(bca)*bc | ca(bca)*bc | a(bca)*bc | bc|c
L(G)={(abc|bc|c)(abc)i | i≥0}
有兴趣的同学课后以下述文法为 例熟悉消除左递归的执行过程:
G[S]: S→Qc | c | Rc Q→Rb | b | Sb R→Sa | a | Qa
第5章 自顶向下语法分析方法
语法分析是编译过程的核心部分, 其 基本任务是在词法分析识别出单词 符号串的基础上, 分析判断程序的语 法结构是否符合语法规则。
1. 自上而下分析的不确定性
对于文法G[S]: S→xAy A→ab | a
ห้องสมุดไป่ตู้
考虑输入串为xay, 其分析过程如下:
S
S
xAy xAy
a
b
a
在上述分析过程中, 若有多个候选 式可供选择, 则需逐一试探每个候 选式。当试探失败时, 必须回溯到 该试探的初始现场, 包括注销已生 长子树、输入串指针回退到试探 前状态。这种带回溯的自上而下 分析法是一种穷举法, 效率很低。
(3) 化简, 删去关于Q和R的产生式: S→abcS' | bcS' | cS' S'→abcS' |
对消除左递归算法的两点说明:
(1)消除左递归算法有两个限制条件: 文法中不含回路和-生成式。
该限制不影响消除左递归算法的 使用, 因为对任一CFG G, 存在一 个不含-生成式和单一生成式的 CFG G', 使得L(G')=L(G)-{}。
对于S (i=3, P3) 内层循环改写:
S→Sabc | abc | bc | c 消除S的直接左递归:
S→abcS' | bcS' | cS'
S'→abcS' |
于是得文法G'[S]: S→abcS' | bcS' | cS' S'→abcS' | Q→Sab | ab | b R→Sa | a
消去直接左递归后得到文法G'[E]:
G'[E]: E→ TE'
E'→ +TE' |
T→ FT'
T'→*FT' |
F→(E) | i
一般地, 设文法中A的产生式为:
A→A1|A2|…|Am| 1|2|…|n 其中, 每个都不等于
每个都不以A开头
消除A的直接左递归, 文法可改写为: