4hh第5章 自顶向下语法分析方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2. 确定的自上而下分析
为了实现确定的自上而下分析, 要求 文法满足下述条件:
(1)文法不含左递归。 左递归: A→A 或 A + A
左递归的存在使自上而下分析过 程陷入无限循环, 因此, 使用自上 而下分析法必须消除左递归。
(2) 分析过程无回溯
回溯的存在可能使已做的大量分析 工作推倒重来, 这会严重影响效率, 因此, 使用自上而下分析法必须消 除回溯。
回溯的存在是由于分析过程中需 对多个候选式进行试探性匹配。
若能根据输入符从A的多个候选式 中选出一个作为全权代表, 使得若 该候选式与输入串匹配成功, 则A 与输入串匹配成功, 否则A与输入 串匹配不成功, 则可消除试探性匹 配, 从而消除回溯。
(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}
(1) 左递归的消除
直接左递归的消除:
方法: 引入一个新非终结符, 把含有左 递归的产生式改写为右递归形式。
考虑产生式: A→A | 其中,是任意串且不以A开头.
A的产生式可改写为: A→A' A'→A'|
例如, 算术表达式文法G[E]为: G[E]: E→E+T | T T→T*F | F F→(E) | i
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
对于S (i=3, P3) 内层循环改写:
S→Sabc | abc | bc | c 消除S的直接左递归:
S→abcS' | bcS' | cS'
S'→abcS'S→abcS' | bcS' | cS' S'→abcS' | Q→Sab | ab | b R→Sa | a
切断循环推导中某个连接的方法:
Step1. 对n个产生式中的某一个进 行至多n-1次替换, 使间接左递归变 成直接左递归, 再消除之。
例如, 消除G[S]中S,Q之间的连接: S Qc|c Rbc|bc|c Sabc|abc|bc|c 改写为: S→abcS'|bcS'|cS'
S'→abcS'|
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 再消除其直接左递归。
例如, 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
消除左递归算法:
(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) 化简, 删去不可达元的产生式。
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
间接左递归的存在是由于非终结符 之间形成了循环推导, 只要把循环 推导中的某个连接切断, 间接左递 归就消除了。
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。
消去直接左递归后得到文法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的直接左递归, 文法可改写为:
(3) 化简, 删去关于Q和R的产生式: S→abcS' | bcS' | cS' S'→abcS' |
对消除左递归算法的两点说明:
(1)消除左递归算法有两个限制条件: 文法中不含回路和-生成式。
该限制不影响消除左递归算法的 使用, 因为对任一CFG G, 存在一 个不含-生成式和单一生成式的 CFG G', 使得L(G')=L(G)-{}。
第5章 自顶向下语法分析方法
语法分析是编译过程的核心部分, 其 基本任务是在词法分析识别出单词 符号串的基础上, 分析判断程序的语 法结构是否符合语法规则。
1. 自上而下分析的不确定性
对于文法G[S]: S→xAy A→ab | a
考虑输入串为xay, 其分析过程如下:
S
S
xAy xAy
a
b
a
在上述分析过程中, 若有多个候选 式可供选择, 则需逐一试探每个候 选式。当试探失败时, 必须回溯到 该试探的初始现场, 包括注销已生 长子树、输入串指针回退到试探 前状态。这种带回溯的自上而下 分析法是一种穷举法, 效率很低。
相关文档
最新文档