1 / 26

2.3 句型的分析

2.3 句型的分析. 句型的分析 :构造一算法,用以判断所给的符号串是否为某文法的句型(句子) 常见分析方法有 自顶向下分析 和 自底向上分析 两类; 自顶向下 从开始符出发试图推导出给定的符号串; 自底向上 推导的逆过程(称归约):从已给的符号串出发,试图将其归约为开始符。. 2.3.1 规范推导和规范归约. 对于一文法而言,从开始符到某句型的 推导过程可能不唯一 。例如,文法 G[E] 中从 E 到 i+i*i 的推导有:

Télécharger la présentation

2.3 句型的分析

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 2.3句型的分析 • 句型的分析:构造一算法,用以判断所给的符号串是否为某文法的句型(句子) • 常见分析方法有自顶向下分析和自底向上分析两类; • 自顶向下 从开始符出发试图推导出给定的符号串; • 自底向上 推导的逆过程(称归约):从已给的符号串出发,试图将其归约为开始符。

  2. 2.3.1 规范推导和规范归约 • 对于一文法而言,从开始符到某句型的推导过程可能不唯一。例如,文法G[E]中从 E 到 i+i*i的推导有: (1)E E+T E+T*F T+T*F T+T*i F+T*i i+T*i i+F*ii+i*i (2)E E+T T+T F+T i+T i+T*F i+F*F i+i*F  i+i*F i+i*i (3)E E+T E+T*F E+T*i E+F*i E+i*i  T+i*i F+i*i i+i*i (4) … …

  3. 规范推导 • 为了让计算机自动地进行推导,通常我们只考虑最左或最右推导。 • 最左(右)推导:在推导序列的每一步直接推导中,被替换的总是当前句型中最左(右)的非终结符。 • 例如,上页中的(2)、(3)分别是最左、最右推导。 • 形式上,从符号串到符号串的推导序列  * xUy  xuy * 总有 xVT* (yVT*) 时,称为最左(右)推导 • 定义:最左(右)推导所得句型称为左(右)句型;最右推导称为规范推导;右句型称为规范句型。

  4. 句子、句型的推导方法 • 每个句子都有相应的最左和最右推导,因此,句子即是左句型也是右句型(规范句型) • 并不是每个句型都有最左和最右推导 • 例如,E + E+i*T即不是左句型,也不是右句型 • 对于给定的符号串w,采用自顶向下的分析来判断w是否为L(G[S])的句子的常见方法是:试图建立从开始符 S到w最左推导: S* w • 显然,每步推导时,对应于最左非终结符相应的产生式可能会有多个,若无特殊的办法,只能一个一个地试探。因此,推导过程可能是带回溯的。 • 为提高效率,就应尽量避免回溯

  5. 自底向上的语法分析 • ~就是从已给的符号串w出发,试图以相反的方向为w建立一个规范推导,最终得到文法的开始符。 • 推导的逆过程称作归约,它是把当前的符号串中的构成文法某个产生式A右部的子串替换成产生式的左部符号A,得到一个新的符号串A。这样的一步动作,称为进行了一步归约。 • 例如,符号串F+i*i中的F可按产生式TF归约为T,从而得到新的符号串T+i*i。 • 若从给定的符号串w出发,一步步地将其归约,最终得到文法的开始符号,则说明w是该文法定义的一个句子。归约成功,否则,归约失败。 • 若归约的每一步都归约的是当前符号串中最左边的某产生式的右部,则称该归约是规范归约(即最左归约)。 • 规范归约是规范推导的逆过程。 • 关于最左(右)归约、直接归约、归约等的形式定义不再赘述。

  6. 符号串i+i*i的归约过程 由上表可以看出,归约过程是最左归约,它恰好是规范推导的逆过程。这正是把最左归约定义为规范归约的原因。

  7. 关于归约的一点说明 • 注意,前面例子中归约的第五步中,当前的符号串为 E+T*i,除了可将i归约成F外,还可将E+T或T归约成E,分别得到符号串E*i和E+E*i。但是,若真按这两个方案进行归约,则当我们把其归约成E*E或E+E*E时,就再也归约不下去了。这就告诉我们在第五步时,唯一正确的归约是将i归约为F,也就是说,i是唯一可被归约的最左子串。 • 那么,对于规范归约的每一步,如何确定符号串中的当前应被归约的最左子串呢? • 这里暂且按下不提,且听2.3.3小节分解。

  8. 2.3.2 语法树和二义性 • 语法树用于直接地描述一个句型右句子的语法结构 • 语法树是一有向树(连通的) 1)有且仅有一个无任何前驱的结点,称为根 (S); 2)除根外,每个结点恰有一个直接前驱; 3)对于任一结点m,从根到m可达; 4) 每个结点的后继是有序的(从左到右) 设G=(VN,VT,P,S)是一文法,则满足下述条件的树称为语法树: 1)每个结点有一标记X, XV; 2)根的标记为S(开始符); 3)若结点X有后继,则XVN; 4)A有k个后继,自左至右为X1, X2, …, Xk,则A X1X2…XkP

  9. E E + T T T * F F F i i i 语法树的性质及实例 • 语法树的所有叶结点自左至右排列构成了文法G的一个句型 • 对一语法树而言,其构造过程不同对应了不同的推导(归约)过程 • 例如,文法G[E]的句型 i+i*i相应的语法树见右图。

  10. 文法的二义性 • 存在这样的文法G,其某个句子wL(G),可对应结构不同的语法树,即w对应了多个不同的最左(右)推导,这类文法称为二义性文法。 • 例如,G3[E]:EE+E|E*E|(E)|i 的句型i+i*i及文法 • Cif B then C|if B then C else C C S 的句型:if B1thenif B2then S1else S2 • 上面两个句型均有两个不同的语法推导树(见下页),所以,它们是二义性文法

  11. C E if B1then C E E + E E * E if B1 then C else C E + E i E * E i S1 S2 i i i i 二义性语法的例子 C if B1 then C else C if B2then C S1 S2

  12. 关于二义性文法 • 应指出,二义性是一种常见的语法现象,然而,对于编译程序而言,二义性文法是有害的。 • 为解决二义性文法带来的不确定性问题,通常的方法一是修改文法,例如,文法G3可用本章(P20 (2.2)式)定义的文法G2[E]取代,而G2不是二义性的。 • 二是利用附加条件。例如,i+i*i的归约过程中,若规定*比+优先级高,则可强制性地让系统先按E*E进行归约,而不是先按E+E进行归约;又比如,若强制规定else只能和距其最近的尚未被匹配的then进行匹配,就可解决else悬空的问题。

  13. 关于二义性文法(续) • 应指出,任一前后文无关文法是否是二义性的是不可判定的。 • 对于某个具体的文法而言,其二义性还是可判定的。 • 存在一些判定文法是否二义性的充分条件: • 若一文法含有既是左递归又是右递归的文法符号,即有 A+ AvA vV* 或A+ A 或 A+ A及 AA则G必定是二义性的。 • 并非所有的文法可消除二义性。即存在这样的CFL,定义它的一切文法都是二义性的。这样的语言称为先天二义性语言。例如, 为一先天二义性语言。CFL的先天二义性也是不可判定的。

  14. E E(1) + T(1) F(1) E(2) + T(2) T(3) * F(3) i 2.3.3 短语和句柄 • 问题: 在自底向上(简记为)的语法分析中,对于每一步直接归约,应如何正确地确定当前句型中应被归约的最左子串? • 考虑文法G2[E]的句型= E+T*F+i,从开始符E 推导出  的语法树见右图 • 该树中含有若干子树,如T(2)为根的子树对应的叶结点为T(3)*F(3),由于它是一直接子树,文法中必有产生式T->T*F;因此,称T*F是句型相对于产生式T->T*F的直接短语.同理,F(1)对应的直接短语为i. • 以E(1)为根的子树相应的叶结点为 E(2)+T(3)*F(3),所以,称为句型相对于非终结符E 的短语.同理,i是相对于T(1)的短语

  15. 短语、直接短语及句柄的定义 • 例如,对句型= E+T*F+i,由定义,有: (1)E* E+T+i(=E+,A=T, =+i)及TT*F(=),故T*F是 相对于产生式T->T*F的直接短语; (2)E* E+T*F+F Fi,i是 相对于产生式F->i的直接短语; (3)E* E+i与 E + E+T*F,E+T*F是相对于非终结符E的短语; (4)E* E及E* E+T*F+i(= ), 是相对于E的短语 注:由定义可知,直接短语也是短语,但短语不一定是直接短语.

  16. 归约时被替换子串的选择 • 从句型=E+T*F+i的语法树可知,E+T绝不是它的一个直接短语,因为虽然E->E+T是G2的一个产生式,但不存在从E到E*F+i的推导,所以,当判断一符串是否为某一句型的短语时,须检查定义2.8的两个条件是否同时满足. • 采用分析时,每步归约就是将一个产生式右部替换其左部,也就是把该句型的语法树中的一棵直接子树的末端结点剪去.即每次归约的符号串必是当前句型的一个直接短语. • 但是,对一句型而言,其直接短语可能不唯一.为了让分析能够机械地进行,我们只考虑规范归约(最左归约),即归约过程替换的是归左直接短语. • 我们以L(G2)的句子i+i*i+i为例,给出其最右推导(规范归约的逆过程),来说明每次规范归约的子符号串

  17. E 11 E + T 8 10 E + T F 3 7 9 T * F T i 2 5 6 F F i 1 4 i i 句柄的定义 • EE+T E+F E+i E+T +i  E+T*F+i E+T*i+i  E+F*i+i  E+i*i+i T+i*i+i F+i*i+i i+i*i+i • 上面的推导过程的逆过程就是规范归约的过程。从其逆过程可看出,每步归约的均是当前句型的最左直接短语(最左直接子树的叶结点)。我们把它称为当前句型的句柄。 • 定义2.9一个句型的最左直接短语称为此句型的句柄。 • 问题:如何确定一规范句型的句柄?句柄应被归约成哪个非终结符? • 这个问题留到第四章介绍。

  18. 2.4 文法的化简与改造 2.4.1 无用符号和无用产生式的删除 设G=(VN,VT,P,S)是一文法,XVNVT,X称为是有用的,若X至少出现在一个句子的推导过程中,即X满足: (1) 存在, V* ,有 S* X (2.12) (2)存在w VT*,使 X * w (2.13) 否则,称X是无用的.若一产生式含有无用符号,则此产生式称为无用产生式. • 无用产生式给语法分析带来了许多麻烦,应予以删除.

  19. 算法2.1将文法G = (VN,VT,P,S),改造为G1=(V’N,VT,P’,S),使得对于每个X  V’N,存在w VT*,满足 X* w. (1)置V’N,P’为空; (2)对于P中每个产生式A,若  (V’NVT)*,则将A加入V’N中; (3)重复(2),直到V’N不再增大; (4)对于每个A P,若   (V’NVT)*,则置A于P’中. 算法2.2任给文法G= (VN,VT,P,S),构造G’=(V’N,V’T,P’,S’),使x (V’NV’T), ,  (V’N V’T)*,有 S * x (1)置V’T为空,V’N={S}; (2)对于 A P,若A  V’N则置中所有非终结符入V’N ,所有终结符入V’T ; (3)重复(2),直到V’不再增大; (4)令P’={A | A P,  (V’N V’T)*,A  V’N} 消除无用产生式的算法

  20. 例G=({S,U,V,W},{a,b,c},P,S),其中,P: SaS | W | U Ua V bV |ac W aW 现对G执行算法2.1: 1.由Ua 和Vac右部都是终结符,V‘N={U,V}; 2.对于SU,由U  V’N有V’N={S,U,V}; 此外再无可放入V’N的符号;P1为 S aS | U Ua V bV |ac 现对G1执行算法2.2: 1.置V’N ={S}; 2.由SU及U a将U及a分别放入V’N (={S,U})和V’T (={a})中; 3.此外, V’N和V’T不再增大; 4.最后结果为: S aS | U Ua 注意,在删除无用符和无用产生式时,应先执行算法2.1再执行算法2.2,就可得到“干净”的文法;若先执行算法2.2,再执行算法2.1所得文法不一定“干净” 消除无用产生式的例子

  21. 2.4.2-产生式的消除 • -产生式是指右部为一空符号串的产生式。因为某些语法分析算法要求不含~,此时应消除之 • 若一语言不含(即L(G)),则可将其完全消除; • 若L(G),则可将文法改造为只有开始符S可推导出(即S P),而且,S不出现在任何产生式的右部,此外再无其它-产生式. • 本节中的算法2.3可用于找出所有可推导出的非终结符 W={A| A* , AVN} • 执行完算法2.3,通过检验SW与否可知L(G)与否; • 算法2.4可消除L(G)情况时的-产生式; • 算法2.5可消除L(G)情况时的-产生式. • 2.4.3 单产生式的消除 (略)

  22. 2.5 文法和语言的Chomsky分类 • 文法的四元组表示是由N.Chomsky于1956年描述形式语言时给出的。他还对产生式的形式给予不同的限制而定义了四类基本文法。 • 0型文法:若P中任一产生式都有一般形式  V+ V*且对, 不加任何限制,则称G为0型文法(短语结构文法,记为PSG: Phrase Structure Grammar)。由0型文法生成(或者说:定义)的语言称为0型(递归可枚举)语言。它可由图灵(Turing)机识别。 • 例如:SACaB CaaaC CBDB CBE aDDa ADAC aEEa AE就是一个0型文法,它所产生的语言为 对于程序设计语言来,0型文法有很大的随意性,还须加以限制

  23. 若一0型文法所有产生式具有形式 1A212其中, 1,2V* V+ AVN,则称G 为1型(前后文有关)文法,记为CSG ( Context Sensitive Grammar)。 1型文法产生的语言称为前后文有关语言CSL,它可由线性限界自动机识别。 命名的由来:只有当非终结符A的前后分别为1,2时,才能将A替换为。 1 型文法还有另一种定义形式: G的每个产生式形为且满足: |  | |  | , V+则G是1型文法 上述两种定义形式是等价的。即任一种形式定义的文法所产生的语言都可由另一种形式定义的文法产生 注:根据定义,含有产生式的文法不是1型文法。由于实际需要,我们将-产生式作为1型文法的特例而接受之。 例 文法G:S | A AaABC AabC CBBC bBbb bCbc cCcc 因G含有-产生式,所以它不是一个严格意义下的1型文法。它所产生的语言为 1型文法和语言

  24. 2型文法和语言 • 若一1型文法G中所有产生式具有形式: A V+ AVN则称G为2型(前后文无关)文法,记为CFG(Context Free Grammar)。 • 2型文法产生的语言称为前后文无关语言CFL,它可由下推自动机识别。 • 若允许-产生式存在,则CFG产生式形式为 A V* AVN • 例:G[S]=({S},{a,b},{SaSb Sab},S) 产生的语言为

  25. 3型文法和语言 • 若一2型文法G中仅含有形如 AaB Aa的产生式,其中 A,BVN , a VT 则称G为右线性文法。 • 类似地,若G中仅含有形如ABa Aa的产生式,则称G为左线性文法。 • 通常,把左线性文法和右线性文法都称为3型文法(正规文法) • 3型文法产生的语言称为3型(正规)语言,它可由有限自动机识别。正规语言可用正规表达式表示。 • 注:若一文法既含左线性又含右线性产生式,则它不一定是3型文法! • 3型文法还可拓广定义为 AB A ( VT +)

  26. 四类语言之间的关系 由各类文法的定义可知,3型语言一定是2型语言,而反之不一定成立;同理,2型语言是1型的也是0型的,反之不真。 若把各类语言视为语言族LK,K=0,1,2,3 则它们之间有真包含关系:

More Related