270 likes | 486 Views
第五章 语法分析 — 自下而上分析. 主 要 内 容. 本章学习自下而上的分析技术,就是从输入串开始,逐步进行 “ 归约 ” ,直到规约到文法的开始符号,或者说,从语法树的末端开始,逐步向上归约,直到根结。 基本概念 算符优先分析法 LR 分析法. 5.1 自下而上分析的基本问题. 归约 规范归约 分析栈的使用与语法树的表示. 归约. 自下而上的分析比自顶向下方法强大,但构造分析算法不易手工完成。 自下而上分析使用显式符号栈完成分析。 分析栈可存放终结符,非终结符。 分析开始栈为空,分析成功栈中只剩开始符号。. 移进、归约.
E N D
主 要 内 容 • 本章学习自下而上的分析技术,就是从输入串开始,逐步进行“归约”,直到规约到文法的开始符号,或者说,从语法树的末端开始,逐步向上归约,直到根结。 • 基本概念 • 算符优先分析法 • LR分析法
5.1 自下而上分析的基本问题 • 归约 • 规范归约 • 分析栈的使用与语法树的表示
归约 • 自下而上的分析比自顶向下方法强大,但构造分析算法不易手工完成。 • 自下而上分析使用显式符号栈完成分析。 • 分析栈可存放终结符,非终结符。 • 分析开始栈为空,分析成功栈中只剩开始符号。
移进、归约 • 自底向上的分析程序有两种可能的动作: 1)移进:将终结符从输入串的开头移进到栈的顶部。 2)归约:假设文法有产生式A->,将栈顶部的串归约为非终结符A。 • 自底向上分析程序由此也称作移进—归约分析程序。 • 移进-归约分析程序将终结符从输入移进到栈直到栈顶能执行一个归约。
例子:P83文法G为 : (1) S →aAcBe (2) A →b(3) A →Ab(4) B→d 步骤: 动作: 要识别的输入串:abbcde 操作 :把栈顶的一串符号用某个产生式的左部符号来代替。
可归约串 • 可规约串的定义不同产生了不同的自下而上的语法分析方法: 各种不同的自下而上的分析的共同点: 边输入单词符号,边规约
S b d a A c e A B b 自上而下的语法树 在第3步中,把栈顶b规约为A 在第5步中,把栈顶Ab规约为A 在第8步中,把栈顶d规约为 B 在第10步中,把栈顶aAcBe规约为 S 这样判断栈顶的符号串的可规约性,如何规约?
规范规约 • 几个概念:P85 短语、直接短语和句柄 • 规范规约:P86 • 规范规约的实质:在移进过程中,当发现栈顶呈现句柄时就用相应的产生式的左部符号进行替换。 • 规范句型:P86
句柄 • 非形式地说,一个串的“句柄”是和一个产生式右部匹配的子串。 • 把句柄归约成该产生式左部的非终结符代表了最右推导逆过程的一步。 • 在很多情况下,匹配某产生式A→β右部的最左子串β不是句柄。这个产生式归约产生的串不能归约成开始符号。
S b d a A c e A B b 现在该明白了为什么在第5步中,把栈顶Ab规约为A,而不是把栈顶b规约为A(因为这时Ab是句柄,而b不是句柄) • 短语、直接短语和句柄的求法 • 短语:子树的末端结点构成的符号串 • 直接短语:简单子树(只有父子两代)的末端结点构成的符号串 • 句柄:最左简单子树的末端结点构成的符号串 (1) S →aAcBe (2) A →b(3) A →Ab(4) B→d
E + E T E + T F T * F i • 求短语、直接短语和句柄 • 文法5.2的句型E+T*F+i • 句型E+T*F+i的短语有:T*F、E+T*F、i 、E+T*F+i • 直接短语有: T*F、i • 句柄是: T*F • 练习:求文法5.2的句子i1*i2+i3的短语、直接短语和句柄 文法5.2:E→T|E+T T →F|T*F F →i|(E)
S A B b B S b a • 求短语、直接短语和句柄 已知文法G:S→AB,A →Aa |bB,B→a|Sb 求该文法的句型baSb的句柄 ba、a和Sb是短语;a和Sb是直接短语,a是句柄
课后练习: 对于文法G: E → E+T | E-T | T T → T*F | T/F | F F → i | (E) (1)证明E +T/F *( i+i)是G的一个规范句型; (2)指出该句型所有的短语、直接短语、句柄。
E + E T T F * E T T F + / ( E ) i2 i1 T F F 文法:E → E+T | E-T | T T → T*F | T/F | F F → i | (E)的句型:E+T/F *( i +i) E+T/F *( i +i)的最右推导过程: E → E+T → E+T *F → E+T *(E) → E+T *( E+T )→ E+T *(E+F) → E+T *(E+i) → E+T *(T+i) → E+T *(F+i) → E+T *(i+i) → E+T/F *( i +i) 能由最右推导得出就证明该句型是个规范句型。 短语: T/F,i1 ,i2 ,i1+ i2 ,(i1+ i2 ),T/F*(i1+ i2 ), E+T/F*(i1+ i2 )直接短语: T/F , i1 ,i2 句柄: T/F
E + E T T F T F * F i3 i1 i2 符号栈的使用与语法树的表示 • 栈是语法分析的一种基本数据结构。
符号栈的四类操作 • 移进:把输入串的一个符号移进栈。 • 规约:发现栈顶呈现可规约串,并用适当的符号替换该符号串。 • 接受:宣布最终分析成功。 • 出错:发现栈顶的内容与输入串相悖,分析工作无法正常进行。 • 移进-归约分析程序描绘出输入串的最右推导的逆序。 • 为了判断要完成的动作,自底向上的分析程序需要在栈内看得更深,不仅仅在顶部。且需和输入中的记号一起考虑。
移进归约分析程序:1)将终结符从输入移进到栈;2)在分析栈顶形成一个能执行归约的产生式的右边。3)位于栈顶部的符号串匹配归约,用该产生式的左部符号代替这个子串。4)每步选则恰当的子串,产生最右推导的逆过程。移进归约分析程序:1)将终结符从输入移进到栈;2)在分析栈顶形成一个能执行归约的产生式的右边。3)位于栈顶部的符号串匹配归约,用该产生式的左部符号代替这个子串。4)每步选则恰当的子串,产生最右推导的逆过程。
算符优先分析 • 三种优先关系 P89 a<b a=b a>b 注意:a<b 不等同于 b> a • 算符文法 定义:一个文法的任一产生式的右部都不含两个相继的非终结符,即不存在…QR… 例子:文法G1:E→EAE|(E)|-E| i A →+|-|*|/(不是) 文法G2:E→T|E+T T →F|T*F F →i|(E) (是)
E E * + E E E E E * E E + E 算符优先文法P90 • 注意:是文法中的任何终结符对(a,b) 至多满足三个关系之一。(优先表) 例子:文法G1:E→E+E| E*E |(E)| i不是算符优先文法,因为+<*而 +> *
E + E T T F T F * F i3 i1 i2 算符优先分析中的可归约串 • 可归约串——最左素短语1)素短语:至少含一个终结符,并且初自身外不再含任何更小的素短语的短语;2)最左素短语:位于句型最左边的那个素短语。 • 求法:类似与句柄的求法例子:文法5.2的句子i 1* i 2+i3 素短语:i 1, i 2,i3 最左素短语:i 1
算符优先分析P93 (1)将输入串R1R2…RK依次逐个进符号栈,直到符号栈顶元素Sj与下一个待输入的符号RK的优先关系满足Sj>RK为止; (2)最左素短语的尾部Sj出现在符号栈顶,由此向前在栈中找到最左素短语的头部Si(就是找到第一个Si<=Q为止) (3)将得到的最左素短语逐个出栈; (4)重复执行上述3个步骤,直到栈顶呈现# N #为止; 注意:对于非终结符,都一律视为N,而不作具体的研究
E T T F * F E T + ( E ) i3 i2 i1 T F F 例子:请用算符优先分析方法判断符号串i * ( i + i )是否为 文法G:E→T|E+T T →F|T*F F →i|(E) 的句子 优先表参见教材P90表5.1
+ + + + FIRSTVT(P)={a| P a…或P Qa…, aVT} LASTVT(P)={a| P … a 或P … aQ, aVT} 算符优先表的构造P91 • 构造优先表的过程就是寻找文法中的终结符号对之间满足3种优先关系的哪一种。 • 对于后选式…ab…或…aQb…,则a=b • 对于后选式… aP…,任何b FIRSTVT(P),则a<b • 对于后选式… Pb…,任何a LASTVT(P),则a>b
构造算符优先表的例子 • 构造文法G(E): E→T|E+T T →P|T*P P →i 的优先表 (1)FIRSTVT的构造P→ a…或P→ Q a …,则a FIRSTVT(P); 文法中E→ E+…,得FIRSTVT(E)={+}; T→ T*…,得FIRSTVT(T)={*}; P →i ,得FIRSTVT(P)={i}; (2)若aFIRSTVT(Q)且P→Q… 则aFIRSTVT(P) 文法中T →P,得FIRSTVT(P) FIRSTVT(T)={*, i}; E →T ,得FIRSTVT(T) FIRSTVT(E)={*,i ,+}; 最终结果FIRSTVT(T)={*, i};FIRSTVT(E)={*,i ,+}; FIRSTVT(P)={i}
构造算符优先表的例子 • 构造文法G(E): E→T|E+T T →P|T*P P →i 的优先表 (1)LASTVT的构造P→ … a或P→ … aQ , 则a LASTVT(P); 文法中E→ … +T ,得LASTVT(E)={+}; T→ … *P,得LASTVT(T)={*}; P →i ,得LASTVT(P)={i}; (2)若aLASTVT(Q)且P→…Q则aLASTVT(P) 文法中T →P,得LASTVT(P) LASTVT(T)={*, i}; E →T ,得LASTVT(T) LASTVT(E)={*,i ,+}; 最终结果:LASTVT (T)={*, i}; LASTVT (E)={*,i ,+}; LASTVT (P)={i}
(1)对P →…ab…或P →…aQb…,有a=b (2)对于后选式P →… aP…,任何b FIRSTVT(P),则a<b (3)对于后选式P →… Pb…,任何a LASTVT(P),则a>b • 构造文法G(E): E→T|E+T T →P|T*P P →i的优先表 1)本例中没有满足条件(1)的终结符号对 2)E→ … +T ,得+ < FIRSTVT (T)={*, i};有+ < *, + < i T→ … *P,得* < FIRSTVT (P)={i};有* < i 3) E→ E+…,得LASTVT(E)>+;有+ > +, *> + ,i > + T→ T*…,得LASTVT (T) > *;有*> *, i > *