第4章-自顶向下的句法分析PPT课件

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

(3) 删除无用的产生式
-
13
这里第二步所做的工作是: a)若产生式出现直接左递归则用消除直接左递归的
方法消除掉。 b)若产生式右部最左符号是非终结符且其序号大于
左部的非终结符,则不处理。 c)若序号小于左部的非终结符,则将这序号小的非
终结符用其右部串来取代,然后消除新的直接左递归。
注意:1)若非终结符排列顺序不同,改写后的文法 也不同,但它们是等价的。2)开始符号不能改变。
(7) R' bcaR'| 得到不含左递归的文法:(1)、(2)、(6)、(7)
-
15
(1) S Qc|c (2)Q Rb|b (3) R Sa|a
对非终结符也可以有不同的排序。 1)对非终结符重新排序:R、Q、S 2)把(3)代入(2)得:(4') Q Sab|ab|b 再把(4')代入(1)得:(5') S Sabc|abc|bc|c 对(5')消除直接左递归得: (6') S abcS'|bcS'|cS' (7') S' abcS'| 得到不含左递归的文法:(6')、(7')
反复提取左因子,就能把每个非终结符(包括 新引进者)的所有候选首字符集变为两两不相 交(即不含公共左因子)。
-
20
例:文法G1[S] 为: S→aSb S→aS S→ε
化为: S→aS(b|ε) S→ε
进一步化为: S→aSA A→b A→ε S→ε
-
21
例:文法G2为: A→ad A→Bc B→aA B→bB
在文法G[S]中的每个非终结符相应的产生 式右部均不含公共左因子的情况下,语法分析 的匹配过程都是唯一匹配,无需试探;这时若 匹配失败,则意味着输入串不是句子。
-
19
设文法中关于A的产生式为 A1∣2∣…∣i∣i+1∣…∣j
可以把这些产生式改写为:
A→δA'∣βi+1∣…∣βj A'→β1∣…∣βi
文法的特点:
1. 每个产生式的右部不全是由终结符号开始。
2. 如果两个产生式有相同的左部,那么它们的右 部由不同的终结符或非终结符开始。
3. 文法中无空产生式。
-
6
为了实现确定的(即无回溯的)自顶向下分析, 则要求文法满足下述两个条件:
(1) 文法不含左递归 直接左递归:A A… 间接左递归: A B…,B+A 左递归文法使自上而下分析工作陷入死循环。 例如,如果有产生式
随着电能应用的不断拓展以电能为介质的各种电气设备广泛进入企业社会和家庭生活中与此同时使用电气所带来的不安全事故也不断发生输入串aadl的分析过程符号栈当前输入符号输入串adl弹出栈顶符号a并将aaa?产生式右部反序压栈adl匹配弹出栈顶符号a并读出下一个输入符号adl弹出栈顶符号a?并将a?abl产生式右部反序压栈lbadl弹出栈顶符号a并将aaa?产生式右部反序压栈lba?adl匹配弹出栈顶符号a并读出下一个输入符号dlba?由a?仅弹出栈顶符号a?lb弹出栈顶符号b并将bdb?产生式右部反序压栈lb?d匹配弹出栈顶符号d并读出下一个输入符号llb?随着电能应用的不断拓展以电能为介质的各种电气设备广泛进入企业社会和家庭生活中与此同时使用电气所带来的不安全事故也不断发生2ll1分析表的构造则规定first
-
14
例:对下面文法消除左递归: (1) S Qc|c (2)Q Rb|b (3) R Sa|a 1) 对非终结符排序:S、Q、R 2) 把(1)代入(3)得:(4) R Qca|ca|a 再把(2)代入(4)得:(5) R Rbca|bca|ca|a 对(5)消除直接左递归得: (6) R bcaR'|caR'|aR'
S A
qB cAd
p
A
Aa
S pA
cAd
S pA
cAd
B dB B b
cAd
W=pccadd自顶向下的推导过程:
S pA
cAd cAd
a
S pA pcAd pccAdd pccadd
-
3
文法G1[S]: S pA | qB A cAd | a B dB | b
文法的特点: 1. 每个产生式的右部都由终结符号开始。 2. 如果两个产生式有相同的左部,那么它们的右
部由不同的终结符开始。
-
4
文法G2[S]:
S Ap
S Bq S
S
Aa A p A p
A cA
cA
B b
B dB
S Ap cA cA
W=ccap自顶向下的推导过程:
S Ap cAp ccAp ccap
S Ap cA cA
a
-
5
文法G2[S]: S Ap | Bq A a | cA B b | dB
E E+T
EE+TE+T+TE+T+T+T…
-
7
(2) 无回溯,对文法的任一非终结符号,当其产生 式右部有多个候选式可供选择时,各候选式所推 导出的终结符号串的首字符集合要两两不相交。 例如,如果有文法G[S]:
S xAy A ab∣a
输入串xay的分析就需要回溯。 带回溯的自顶向下分析方法实际上是一种穷举的 试探方法,其分析效率极低。
在不含左递归和每个非终结符的所有候选式推导 出的终结符号串的首字符集都两两不相交的条件 下,就可能构造一个不带回溯的自顶向下的分析 程序。这样的一个分析程序称为递归下降分析器。
-
23
例如,下面的文法对应的递归下降分析器。 G'[E]: E TE' E' +TE'∣ T FT' T' *FT'∣ F (E) ∣i
do{ 把栈顶符号弹出并放入X中;
if(XVT) {
if(X==a) 将下一输入符号读入a;
else error();
}
else
if(M[X,a]=“XY1Y2…Yk”) {
1.化为: A→ad A→aAc A→bBc B→aA B→bB
2.化为: A→a(d|Ac) A→bBc B→aA B→bB 3.化为: A→aA' A→bBc A'→d A'→Ac B→aA B→bB
-
22
4.3.1 递归下降分析法
文法的每个非终结符对应一个递归过程。分析过 程就是从文法开始符出发执行一组递归过程,这 样向下推导直到推出句子;或者说从根结点出发, 自顶向下为输入串寻找一个最左匹配序列,建立 一棵语法树。
-
9
例如,含有直接左递归的表达式文法G[E]为: G[E]: E E+T∣T T T*F∣F F (E)∣i 消去直接左递归后得到文法G'[E]为:
G'[E]: E TE' E' +TE'∣
T FT' T' *FT'∣ F (E)∣i
-
10
2. 间接左递归
将间接左递归变为直接左递归,然后消除直接左 递归。
自顶向下(top-down)的句法分析:反复使用不同 产生式进行推导以谋求与输入符号串相匹配。
自底向上(bottom-up)的句法分析:对输入符号串 寻找不同产生式进行归约直到文法开始符号。
注:这里所说的输入符号指词法分析所识别的单词。
-
2
确定的自顶向下分析思想
例 文法G1[S]:
S pA S
第4章 自顶向下的句法分析
自顶向下分析方法
递归下降分析法 LL(1)分析法
自底向上分析方法
算符优先分析法 LR分析法
-
1
4.1 句法分析器概述
句法分析是编译程序的核心部分。 任务:识别由词法分析得出的单词序列是否是
合法的句子。 理论基础:上下文无关文法和下推自动机 句法分析方法:
如文法G[A]含有间接左递归:
A aB
A aB
A Bb
A Bb
B Ac
B aBc
Bd
B Bbc
A aB A Bb B aBcB'| dB' B' bcB'| ε
Bd
-
11
消除文法中一切左递归的算法
要求:无回路(即不存在A+A的推导)
充分条件:文法不含形如AA的有害产生 式,也不含A的空产生式。
控制程序(表驱动程序)
-
32
输入串: a1 a2
… ai
… an #
栈顶
xj

x1 # 分析栈
控制程序 分析表M
LL(1)分析器
输出
-
33
(1) 输入串是待分析的符号串,它以界符 “#”作为结束标志。(注:#VT但不是文 法符号,是由分析程序自动添加的。)
(2) 分析栈中存放分析过程中的文法符号。 分析开始时栈底先放入一个“#”,然后再 压入文法的开始符号;当分析栈中仅剩 “#”,输入Байду номын сангаас指针也指向串尾的“#”时, 分析成功。
i.若M[A,a]中为一个A的产生式,则将A 自栈顶弹出,并将M[A,a]中的产生式右部 符号串按逆序逐一压入栈中;如果M[A,a] 中的产生式为A ,则只将A自栈顶弹出。
ii.若M[A,a]中为空,则发现语法错误, 调用出错处理程序进行处理。
-
37
控制程序描述如下: 将“#”和文法开始符依次压入栈中; 把第一个输入符号读入a;
LL(1)分析法是一种预测分析法。
LL(1)的含义是:第一个L表明自顶向下分析是从 左至右扫描输入串的;第二个L表明分析过程中 将用最左推导;“1”表明只需向右查看一个符号 就可决定用哪个产生式进行推导。类似地,也可 以有LL(k)文法,也就是向前查看k个符号才能确 定选用哪个产生式,不过LL(k)(k>1)在实际中极 少使用。
预测与提左因子
预测
根据超前读入符号选择候选式,使其第一个符号 与超前读入符号相同,或该候选式可推导出的第 一个符号与超前读入符号相同。这相当于向前看 了一个符号,所以称为预测。
注:使用了预测之后,选择候选式不再是盲目的 了,所以也就无需回溯。
-
18
5)提取公共左因子
倘若产生式的候选式不含公共左因子,则 推导出的首字符能与输入符号匹配的那个候选 式便是唯一的匹配。
-
35
(4) 控制程序根据分析栈顶符号X和当前输 入符号a来决定分析器的动作:
① 若X=a=“#”,则分析成功,分析器停止 工作。
② 若X=a“#”,即栈顶符号X与当前扫描 的输入符号a匹配;则将X从栈顶弹出,输 入指针指向下一个输入符号,继续对下一 个字符进行分析。
-
36
③ 若X为一非终结符A,则查M[A,a]:
else if (lookahead =='(')
{
match ('(');
E();
if (lookahead ==')')
match (')');
else error ();}
else error();}
-
30
4.3.2预测分析法
预测语法分析器能够通过观察候选式所推导出的 第一个符号,确定正确的候选式。
-
24
void match (token t){ if (lookahead == t) lookahead = nexttoken; else error();
}
-
25
E TE'
void E(){ T(); E'();
}
-
26
E' +TE'∣ void E'(){ if (lookahead == '+'){ match ('+'); T(); E'(); } }
-
27
T FT'
void T(){ F(); T'();
}
-
28
T' *FT'∣
void T'(){ if (lookahead =='*'){ match ('*'); F(); T'(); }
}
-
29
F (E) ∣i
void F()
{ if (lookahead == 'i')
match ('i');
-
34
(3) 分析表用一个矩阵M表示,它概括了相应文法 的全部信息。矩阵的每一行与文法的一个非终结 符相关联,而每一列与文法的一个终结符或界符 “#”相关联。对M[A,a]来说,A为非终结符,而a 为终结符或“#”。分析表元素M[A,a]中的内容为 一条关于A的产生式,表明当A面临输入符号a时 当前推导所应采用的候选式;当元素内容为空白 (空白表示“出错标志”)时,则表明A不应该面临 这个输入符号a,即输入串含有语法错误。
-
31
1.表驱动的LL(1)分析器
基本思想:根据输入串的当前输入符号来唯一确 定选用某条产生式来进行推导;当这个输入符号 与推导的第一个符号相同时,再取输入串的下一 个符号,继续确定下一个推导应选的规则;直到 推导出被分析的输入串为止。
LL(1)分析器:
LL(1)分析表(也称预测分析表)
先进后出分析栈
-
12
(1) 将所有非终结符排序:A1、A2、…、An; (2) for (i=1;i<=n;i++){
for (j=1;j<=i−1;j++){
Aj1|2|…|k }
若 Aj 的 所 有 产 生 式 为 :
则把形如AiAjr的产生式变换为: Ai1r|2r|…|kr
消除Ai规则中的一切直接左递归; }
-
8
消除左递归
1. 直接左递归 方法是引入一个新的非终结符,把含有左递归的
产生式改为右递归。设关于A的产生式为 A A1∣A2∣…∣Am∣1∣2∣…∣n 其中,每个i都不为且每个j都不以A开头,则
消除A的直接左递归就是将其改写为:
A → β1A '∣ β2A '∣ … ∣ βnA ' A '→ α1A '∣ α2A '∣ … ∣ αm A '∣ ε
-
16
消除回溯
产生回溯的原因
进行推导时,若产生式存在多个候选式,选择哪 个候选式进行推导存在不确定性。
消除回溯的基本原则
对文法的任何非终结符,若能根据当前读入的符 号,准确的选择一个候选式进行推导,那么回溯 就可以消除。
注:之所以会产生回溯是因为在推导匹配的过程中 存在虚假匹配。
-
17
消除回溯的方法
相关文档
最新文档