版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章LR分析法1965D.knuth首先提出了LR(K)LR(K)分析技术。LR(K)分析是指自左向右扫描和自底向上的语法分析,且在分析的每一步,只须根据分析栈中当前已移进和归约出的全部文法符号,并至多再向前查看K个输入符号,就能确定相当于某一产生式右部符号的句柄是否已在分析栈的顶部形成。从而也就可以确定所应采取的分析动作(是移进输入符号还是按某产生式进行归约)。当前扫描到Xn+1,k个符号,来确定是把Xn+1移进栈,还是把Xi…Xn作为句柄进行归约。1)要归约时,则根据某产生式U→XiXi+1…Xn进行归约:#X1X2…Xi-1UXn+1Xn+2…Xn+k…#例:#X1X2…Xi…XnXn+1Xn+2…Xn+kXn+k+1…#栈顶(续页)LR(0)表示在每一步分析时都不用向前输入符号LR(1)表示在每一步分析时都向前看一个输入符号来决定当前的动作。SLR(1)表示简单的LR(1),即只在动作不唯一的地方向前看一个符号,在动作唯一时则不向前看输入符号。2)要移进时,即把Xn+1进栈,并读下一符号:#X1X2…Xi…XnXn+1Xn+2…Xn+k…#在栈中当前扫描符栈顶6.1LR分析概论一.LR分析器的逻辑结构及工作过程
从逻辑上来说,一个LR分析器如图:输入串#…ai…a1Sp→X1#S1S0┋┋┋┋XmSm总控程序输出ACTION表GOTO表其中S栈为状态栈X栈为符号栈栈即一个LR(k)分析器主要由:总控程序,分析栈(状态栈和符号栈)输入队列和分析表组成。一般来说所有LR分析器的总控程序基本上是大同小异。只有分析表各不相同。一般主要讨论三种不同的分析表的构造方法。第一种称为规范LR分析表构造法。用此法构造的分析表功能最强而且也适合于很多文法,但实现代价比较高。第二种称为简单LR(即SLR)分析表构造法。这是一种比较容易实现的方法。但SLR分析表的功能太弱,而且对某些文法可能根本就构造不出相应的SLR分析表。第三种称为向前LR(即LALR)分析表构造法。这种方法构造的分析表功能介于规范LR分析表SLR分析表之间。这种表适用于绝大多数程序语言的文法。而且也可以设法有效的实现。二、LR分析器的分析过程如下:1.首先将初始状态S0及句子的左界限#分别压入状态栈和符号栈中。则用栈顶状态Sm和当前扫描符ai组成符号对(Sm,ai)去查分析动作表,根据ACTION[Sm,ai]的指示完成相应的分析动作。表中每一表元素所规定的动作仅能是下列四种动作之一:
S0S1
S2…Sm
Sm+1ai+1ai+2…an
#
#X1X2…Xmai↑↑↓2.设在分析中的某一步,分析栈及余留的输入串为如下格局:
↓
S0S1…Sm
aiai+1…an#X1…Xm
↑
↑(1)ACTION[Sm,ai]=Sm+1(移进)表明句柄尚未在栈顶形成,此时正期待移进输入符号以便形成句柄。故将当前的输入符号和表元素Sm+1分别压入栈中,有(2)ACTION[Sm,ai]=Rj(归约)表明此时应按文法的第j个产生式A→Xm-k+1Xm-k+2…Xm进行归约。即栈顶符号串Xm-k+1Xm-k+2…Xm已成为当前句型的句柄。所谓按第j个产生式归约,就是将分析栈中从顶向下的k个符号退栈,然后将文法符号A压入符号栈中。此时分析的格局为:↓
S0S1…Sm-k
aiai+1…an##X1…Xm-kA↑↑然后以(Sm-k,A)去查状态转移表,设GOTO[Sm-k,A]=Sl,则将此新状态压入状态栈中,则有如下格局:↓
S0S1…Sm-kSl
aiai+1…an##X1…Xm-kA↑↑(3)ACTION[Sm,ai]=acc(接受)表明当前的输入串已被成功地分析完毕,应停止分析器的工作。其中Z为文法开始符号Sα为使ACTION[Sα,#]=acc的唯一状态(接受状态)(4)ACTION[Sm,ai]=ERROR(空白)。
表明当前的输入串中含有错误,也应终止当前的分析工作。转出错处理。3.重复上述第2步的工作,直到分析栈顶出现“接受状态”或“出错状态“为止。对接受状态,分析栈的格局为:↓S0Sα
##Z↑↑例:有文法G[S]:1:S→aAcBe2:A→b3:A→Ab4:B→d其ACTION表和GOTO表为:考察对输入串abbcde#的分析过程。r1r1r1r1r1r1r4r4r4r4r4r4S9r3r3r3r3r3r37S8r2r2r2r2r2r2S6S53S4acc1S2BAS#dbecaGOTOACTION0123456789S
aAcBeAbdb对输入串abbcde#的分析过程为:ACTIONGOTO步骤状态栈符号栈输入流分析动作下一状态10#abbcde#S2(0,a)202#abbcde#S4(2,b)3024#abbcde#r2(4,b)GOTO[2,A]=34023#aAbcde#S6(3,b)6023#aAcde#S5(3,c)50236#aAbcde#r3(6,b)GOTO[2,A]=370235#aAcde#S8(5,d)802358#aAcde#r4(8,d)GOTO[5,B]=7902357#aAcBe#S9(7,e)10023579#aAcBe#r1(9,#)GOTO[0,S]=11101#S#acc(1,#)6.2LR(0)分析表的构造为了给出构造LR(0)分析表的算法,引出一些术语:1、规范句型的活前缀前缀:一个符号串的前缀是指该串的任意首部(包括)。例如abc的前缀有:,a,ab,abcabcd的前缀有:,a,ab,abc,abcd由此可知,对于符号串而言,其前缀的数量为+1。例:有文法G[S]:S→aAcBe[1]A→b[2]这里在每条产生式后加上了产生A→Ab[3]式的序号[i]当进行推导时把序号B→d[4]带上,以便说明问题。对输入串abbcde进行推导如下(最右推导):SaAcBe[1]aAcd[4]e[1]
aAb[3]cd[4]e[1]ab[2]b[3]cd[4]e[1]由此可知,abbcde是该文法的句子。由于LR方法是自底向上的分析,故应采用归约。最左归约为:ab[2]b[3]cd[4]e[1]用[2]式归约
aAb[3]cd[4]e[1][3]
aAcd[4]e[1][4]aAcBe[1][1]S其中表示归约符从归约的过程可看出,每次归约时,归约前和归约后的被归约部分与剩余部分合起来仅构成文法的规范句型,而用哪个产生式归约仅取决于当前句型的前面部分;X1X2…Xn[p]其中Xi为文法的符号,[p]为第p个产生式序号。如上例中每次归约前句型的前面部分为:ab[2]aAb[3]aAcd[4]acABe[1]我们把规范句型的这种前端部分的串称为可归前缀。实际上,它们恰好是符号栈栈顶形成句柄时符号栈中的内容。S→aAcBe[1]A→b[2]A→Ab[3]B→d[4]这是因为一旦句型的句柄在符号栈顶形成,将会立即被归约之故。所以我们将把规范句型具有上述性质(即不含句柄之后的任何符号)的前缀称之为可归前缀。对各规范句型有前缀:ab[2]b[3]cd[4]e[1],a,abaAb[3]cd[4]e[1],a,aA,aAbaAcd[4]e[1],a,aA,aAc,aAcdaAcBe[1],a,aA,aAc,aAcB,aAcBe可以发现前缀a,ab,aA,aAc是多个规范句型的前缀,因此我们可进一步把形成可归前缀前和形成可归前缀时的所有规范句型的前缀都称为活前缀。可归前缀:是指规范句型的一个前缀,这种前缀不含句柄之后的任何符号。活前缀:可归前缀的任意首部。特指在分析过程中对于在栈顶形成句柄之前和恰好形成句柄时,每一步中符号栈中的那些符号组成的符号串。活前缀定义:在前面例中对输入串abbcde的归约分析过程中,在规范归约过程中的任何时候只要已分析过的部分即在符号栈中的符号串均为规范句型的活前缀,它表明输入串的已被分析过的部分是该文法某规范句型的一个正确部分。由此可形式地定义活前缀如下:定义6.1:若S'*A
是文法G中的一个规范推导,如果符号串是的前缀,则称是G的一个活前缀。其中S'为文法开始符号。RR2、LR(0)项目由上述分析和定义可知,活前缀与句柄间的关系不外乎下述三种情况:
(1)活前缀中已含有句柄的全部符号(句柄的最后符号就是活前缀的最后符号)。
(2)活前缀中只含有句柄的前部分符号(句柄的最左子串为活前缀的最右子串)。(3)活前缀中全然不包含句柄的任何符号。第一种情况表明:此时某一产生式A→β的右部β已出现在符号栈顶,因此此时相应的分析动作应当是用此产生式进行归约。第二种情况表明:形如A→12的产生式的右部子串已在符号栈栈顶,如1,正期待着从余留的输入串中看到能由β推出的符号串,即期待2进栈以便能进行归约。故此时分析动作是“移进”当前输入符号。第三种情况则意味着:期望从余留输入串中能看到由某产生式A→的右部,即所代表的符号串(即句柄)。所以此时分析的动作也是读输入符进符号栈。为了刻画在分析过程中,文法的一个产生式右部符号串有多大部分已被识别,我们可在该产生式的右部相应位置上加一个圆点“.”,来指示位置,标明在“.”前的部分已被识别。如上述三种情况,可分别标注为:A→β.;A→1.2;A→.。我们把右部某位置上标有圆点的产生式称为相应文法的一个LR(0)项目。特别地,对形如A→的产生式,相应的LR(0)项目A→.,显然不同的LR(0)项目,反映了分析过程中符号栈顶的不同情况。例如:产生式S→aAcBe对应有六个项目。[0]S→.aAcBe[1]S→a.AcBe[2]S→aA.cBe[3]S→aAc.Be[4]S→aAcB.e[5]S→aAcBe.例如:产生式S→aAcBe对应有六个项目。[0]S→.aAcBe[1]S→a.AcBe[2]S→aA.cBe[3]S→aAc.Be[4]S→aAcB.e[5]S→aAcBe.一个产生式可对应的项目的数量为它的右部符号串长度加1,值得注意的是对空产生式,即A→ε仅有项目A→.每个项目的含义与圆点的位置有关。概括地说,圆点左边的子串表示在分析过程的某一时刻用该产生式归约时句柄中已识别过的部分,圆点右边的子串表示待识别的部分。文法的全部LR(0)项目将是构造识别它的所有活前缀的有穷自动机的基础。3、LR(0)项目的分类:例:考虑文法G[S]=({S,A,B},{a,b,c,d},P,S),构造其分析表:其中P:(1)S→A(2)S→B(3)A→aAb(4)A→c(5)B→aBd(6)B→d解:求该文法的项目集规范族C:为了方便起见,我们在上述文法中引起一个新的开始符号S',且将S'→S作为第0个产生式添加到文法G中,从而得到了所谓G的拓广文法G'。显然L(G')=L(G),则对于文法G',其LR(0)项目为:1)S'→.S2)S'→S.3)S→.A4)S→A.
5)S→.B6)S→B.
7)A→.aAb8)A→a.Ab9)A→aA.b10)A→aAb.
11)A→.c12)A→c.
13)B→.aBd14)B→a.Bd15)B→aB.d16)B→aBd.
17)B→.d18)B→d.G':(0)S'→S(1)S→A(2)S→B(3)A→aAb(4)A→c(5)B→aBd(6)B→d如前所述,由于不同的项目反映了分析过程中栈顶的不同情况,因此,我们可根据它们不同的作用,将一个文法的全部LR(0)项目进行分类:对于形如A→.的项目,因为它表明右部符号串已出现在栈顶,此时相应的分析动作应当是按此产生式进行归约,故我们将此种项目称为归约项目。上例中的项目2),4),6),10),12),16),18)均是归约项目。其中项目2)显然仅用于分析过程中的最后一次归约,它表明整个分析过程已成功地完成,所以我们特别地将它称为接受项目。对于拓广文法而言,接受项目是唯一的。由此可看出到我们为什么要首先将文法拓广的原因。对于形如A→.Xβ的项目(其中可以是),根据前面的讨论可知,当X为终结符时,相应的分析动作应将当前的输入符号移入栈中,故我们将此种项目称为移进项目。上例中的项目7),9),11),13),15),17)就都是移进项目;
当X为非终结符时,由于我们期待着从余留的输入符中进行归约后而得到X,因此将此类项目称为待约项目。上例中的1),3),5),8),14)就都是待约项目。在LR方法实际过程中,并不是去直接分析符号栈中的符号是否已形成句柄,但它给我们一个启示,我们可以把终结符和非终结符都可看成一个有限自动机的输入符号,每把一个符号进栈时看成已识别过该符号,而状态进行转换(到下一状态),当识别到可归前缀时相当于栈顶已形成了句柄,则认为到达了识别句柄的终态。4、构造识别活前缀的DFA
在作出文法的全部LR(0)项目之后,现在将用它们来构造识别全部活前缀的DFA。这种DFA中的中每一个状态由若干个LR(0)项目所组成的集合(称为项目集)来表示。下面以上例中的文法为例来说明构造DFA的方法。
首先我们用I0表示这个DFA的初态,它预示着整个分析过程的开始,并且期待着将给定的输入串逐步归约为文法的开始符号S'。或者反过来说,我们所期待的是,从使用产生式S'→S开始,能够逐渐推导出所给定的输入串。因此,我们应将项目S'→.S列入项目集I0之中。换言之,也就是我们正期待将要扫描的输入串正好就是能由S'推导出的任何终结符串。然而,我们不能从输入串中直接读出非终结符号S,因此我们也应将项目S→.A和S→.B加入I0中。由于A和B同样是非终结符,所以也应将A→.aAb和A→.c和B→.aBb,B→.d加入I0中。由于最后加入I0的项目在圆点之后已都是终结符了,故I0已经“封闭”,宣告项目集I0构造结束。这样,表示初态的项目集I0将由如下项目组成:I0:S'→.S,S→.A,S→.B,A→.aAb,A→.c,B→.aBd,B→.d我们将LR(0)项目S'→.S称为项目集I0的基本项目,上述从S'→.S出发构造项目集I0的过程,可用一个对其基本项目集{S'→.S}的闭包运算,即closure({S'→.S})来表示。一般地,设I为项目集,I的闭包closure(I)的定义为:Closure(I)=I∪{A→.A→∈G∧K→.A∈closure(I)∧∈V*∧∈V*}故构造closure(I)的算法为:1)I中的每一个项目都属于closure(I);2)若形如K→.A的项目属于I,且A→是文法的一个产生式,则关于产生式A的任何形如A→.的项目也应加到closure(I)中(若它们不在closure(I)中);3)重复上述过程,直至不再有新的项目加入到closure(I)中为止。有了初态项目集I0之后,我们来说明如何确定从I0可能转移到的下一状态。设A为一文法符号(A∈V),若I0中有圆点位于A左边的项目K→
.A(其中可能为),则当分析器从输入串识别出(即移进或归约出)文法符号A后,分析器将进入它的下一状态。设此状态为Ii,显然Ii中必含有全部形如K→A.的项目,我们将这样的项目称为K→.A的后继项目。对于每一个文法符号A,如果存在这样的后继项目,则可能不只一个,设其组成集合J,则J中的每个项目都是项目集Ii的基本项目,因此,按照与上面构造项目集I0相类试的讨论,我们有:Ii=closure(J)为了指明Ii是“I0关于文法符号A的后继状态”这一事实,我们可定义一个状态转移函数:GO(I,A)=closure(J)其中,I是当前状态,A为文法符号,J是I中所有形如K→.A的项目之后继项目K→A.所组成的集合,而closure(J)就是项目集I(即状态I)关于符号A的后继项目集(即后继状态)。即:GO(I,A)=closure({所有形如[K→A.]的项目[K→.A]∈I})对于上例,我们有:
I1=GO(I0,S)=closure({S'→S.})I1:S'→S.;
I2=GO(I0,A)=closure({S→A.})I2:S→A.;
I3=GO(I0,B)=closure({S→B.})I3:S→B.;
I4=GO(I0,a)=closure({A→a.Ab,B→a.Bd})I4:A→a.AbB→a.BdA→.aAbB→.aBdA→.cB→.d
I5=GO(I0,c)=closure({A→c.})I5:A→c.
I6=GO(I0,d)=closure({B→d.})I6:B→d.此时,我们求出了I0的全部后继项目集I1,I2,I3,I4,I5,I6,而I1,I2,I3,I5,I6均无后继项目集,仅I4有后继项目集:I7=GO(I4,A)=closure({A→aA.b})={A→aA.b}I9=GO(I4,B)=closure({B→aB.d})={B→aB.d}此外,还有:GO(I4,a)=closure({A→a.Ab,B→a.Bd})=I4GO(I4,c)=closure({A→c.})=I5GO(I4,d)=closure({B→d.})=I6这些项目集均不产生新的项目集。另外还有:I8=GO(I7,b)=closure({A→aAb.})={A→aAb.}I10=GO(I9,b)=closure({B→aBd.})={B→aBd.}此时I8,I10也已无后继项目集,故我们已求出文法G[S']的全部项目集I0~I10。通常我们将这些项目集的全体称为文法G[S']的LR(0)项目集规范族,并记为C=(I0,I1,…,I10)于是,我们所要构成的识别文法G[S']的全部活前缀的DFA为M=(C,V,GO,I0,Z)其中C—M的状态集,即文法G[S']的LR(0)项目集规范族I0~I10
V—M的字母表,即V={S',S,A,B,a,b,c,d};GO—M的映射函数,即上面定义的状态转移函数GO;I0—M的唯一初态;Z—M的终态集,ZC为规范族中所有含有归约项目的那些项目集。DFA:I0:S'→.SS→.AS→.BA→.aAbA→.cB→.aBdB→.dI1:S'→S.I2:S→A.I3:S→B.I4:A→a.AbA→a.BdA→.aAbA→.cB→.aBdB→.dI8:A→aAb.I7:A→aA.bI9:B→aB.dI10:B→aBd.I5:A→c.I6:B→d.ABdbcddacSABaDFA即:I0I1I2I3I4I5I6I7I9I8I10SABacdcdABbd4、LR(0)分析表的构造对于一个文法G的拓广文法G',当识别它的全部活前缀的DFA作出之后,我们可以据此构造相应的LR(0)分析表了。然而,要注意的是,用前述方法所构造的每一个LR(0)项目集实质上表征了在分析过程中可能出现的一种分析状态;再根据前面对LR(0)项目的分类,项目集中的每一个项目又与某一种分析动作相关联,因此,就要求每一个项目集中的的诸项目应当是相容的。所谓相容,是指在一个项目集中不出现下列的情况:(1)移进项目和归约项目并存,即存在移进—归约冲突;(2)多个归约项目并存,即存在归约—归约冲突。如果一个文法G满足上述条件,也就是它的每个LR(0)项目集中都不含有冲突的项目,则称G为LR(0)文法。显然,只有当一个文法是LR(0)文法时,才能对它构造不含冲突动作的LR(0)分析表来。为了方便起见,我们用整数0,1,2,…表示状态I0,I1,I2,…;分析表的内容由两部分组成,一部分为动作(ACTION)表,它表示当前状态下所面临的输入符号应做的动作是移进、归约、接受或出错。另一部分为状态转移(GOTO)表,它表示在当前状态下面临文法符号时应转向的下一个状态,相当于识别活前缀的有限自动机DFA的状态转换矩阵。分析表的行标为状态号,动作表的列标为只包含终结符和“#”;状态转移表的列标为非终结符,而将其有关终结符的各列并入到ACTION表的各列中去,也就是把当前状态下面临终结符应作的动作和状态转移用同一数组元素表示,以便节省存储空间。构造LR(0)分析表的算法为:(1)对于每一项目集Ii中形如A→.X的项目,且有GO(Ii,X)=Ij,若X为一终结符号a时,则置ACTION[i,a]=Sj;若X为一非终结符号时,则仅置GOTO[i,X]=j(2)若Ii中有归约项目A→.,设A→为文法第j个产生式,则对文法的任何终结符和“#”(均记为a)置ACTION[i,a]=Rj(3)若接受项目S'→S.属于Ii,则置ACTION[i,#]=acc。(4)在分析表中,凡不能按上述规则填入信息的元素,均置为“出错”。如上例可构造分析表为:ACTIONGOTOabcd#SAB0S4S5S6123AccR1R1R1R1R1
R2R2R2R2R2
S4S5S679R4R4R4R4R4R6R6R6R6R6S8R3R3R3R3R3S1010R5R5R5R5R55、LR(0)分析器的工作过程
对于一个文法构造了它的LR(0)分析表就可以在LR分析器的总控程序控制下对输入串进行分析,即根据输入串当前符号a和分析栈栈顶状态i查找分析表应采取的动作,对状态栈和符号栈进行相应的操作即移进、归约、接受或报错。具体为:1)若ACTION[i,a]=Sj,a∈VT,则把a移进符号栈,j移进状态栈。2)若ACTION[i,a]=Rj,a∈VT或#,则用第j个产生式归约。并将两个栈的指针减去K(其中K为第j个产生式右部的串长度),并把产生式的左部符号A压入符号栈,同时用符号对(Si-k,A)去查GOTO表(其中Si-k为状态栈当前栈顶元素,若GOTO[Si-k,A]=j,则j压入状态栈,使得两个栈内的元素一样多。3)若ACTION[i,a]=Acc,(此时a应为“#”号),则表明分析成功,结束分析。4)若ACTION[i,a]=空白,转出错处理。6.3SLR(1)分析
因大多数程序设计语言的文法不能满足LR(0)文法的条件,即使是描述一个变量这样简单的文法也不是LR(0)文法。因此下面将介绍对LR(0)规范族中有冲突的项目集(状态)用向前查看一个(输入)符号的办法进行处理,以解决冲突。这种分析方法因为只对有冲突的状态才向前查看一个符号,以确定做什么动作,故称这种分析方法为简单的LR(1)分析法,用SLR(1)表示。假定有一个LR(0)规范族中含有如下项目集(状态)I:I={X→.b,A→.,B→.}其中,,,为符号串,b∈VT,显然I中含有移进—归约和归约—归约冲突。那么只要在所有含有A或B的句型中,直接跟在A或B后面的可能终结符集合FOLLOW(A)和FOLLOW(B)互不相交,且都不包含b,即只要满足:FOLLOW(A)∩FOLLOW(B)=φFOLLOW(A)∩{b}=φFOLLOW(B)∩{b}=φ即:FOLLOW(A)∩FOLLOW(B)∩{b}=φ那么,当在状态I面临某输入符号为a时,则动作可由下述规定决策:1)若a=b,则移进。2)若a∈FOLLOW(A),则用产生式A→归约。3)若a∈FOLLOW(B),则用产生式B→归约。一般地,对于LR(0)规范族的一个项目集I可能含有多个移进项目和多个归约项目,我们可假设项目集I中有m个移进项目:A1→1.b11,A2→2.b22,…,Am→m.bmm;同时含有n个归约项目:B1→1.,B2→2.,…,Bn→n.,只要集合{b1,b2,…bm}和FOLLOW(B1),FOLLOW(B2),…,FOLLOW(Bn)两两交集都为空,则我们仍可用上述归则来解决冲突:1)若a∈{b1,b2,…,bm},则移进。2)若a∈FOLLOW(Bi),i=1,…,n,则用Bi→i进行归约。3)此外,则报错。所以,我们只须把构造LR(0)分析表算法中的规则(2),即:(2)若Ii中有归约项目A→.,设A→为文法第j个产生式,则对文法的任何终结符和“#”(均记为a)置ACTION[i,a]=Rj。修改为:即:(1)对于每一项目集Ii中形如A.X的项目,且有GO(Ii,X)=Ij,若X为一终结符号a时,则置ACTION[I,a]=S;若X为一非终结符号时,则仅置GOTO[i,X]=j;(2')若归约项目A→.属于Ii,设A→为文法第j个行产生式,则对任何属于FOLLOW(A)的输入符号a,置ACTION[i,a]=Rj;(3)若接受项目S'→S.属于Ii,则置ACTION[i,#]=acc。(4)在分析表,凡不能按上述规则填入信息的元素,均置为“出错”。(2')若归约项目A→.属于Ii,设A→为文法第j个行产生式,则对任何属于FOLLOW(A)的输入符号a,置ACTION[i,a]=Rj。其余的规则不变,就得到了构造SLR(1)分析表的算法。例如:有算术表达式文法G[E],构造其LR(0)项目规范簇和SLR(1)分析表。
G[E]:E→E+TT
T→T*FF
F→(E)i
解:1、拓广文法为G'[S']:(0)S'→EE→E+TE→TT→T*FT→FF→(E)F→i2、再求识别G'的全部活前缀的DFA(即LR(0)的项目集规范):I0:S'→.EGO(I0,E)=I1E→.E+TGO(I0,E)=I1E→.TGO(I0,T)=I2T→.T*FGO(I0,T)=I2T→.FGO(I0,F)=I3F→.(E)GO(I0,()=I4I1:S'→E.E→E.+TGO(I1,+)=I6I2:E→T.T→T.*FGO(I2,*)=I7I3:T→F.I4:F→(.E)GO(I4,E)=I8E→.E+TGO(I4,E)=I8E→.TGO(I4,T)=I2T→.T*FGO(I4,F)=I2T→.FGO(I4,F)=I3F→.(E)GO(I4,()=I4F→.iGO(I4,i)=I5I5:F→i.I6:E→E+.TGO(I6,T)=I9T→.T*FGO(I6,T)=I9T→.FGO(I6,F)=I3F→.(E)GO(I6,()=I4F→.iGO(I6,i)=I5I7:T→T*.FGO(I7,F)=I10F→.(E)GO(I7,()=I4F→.iGO(I7,i)=I5I8:F→(E.)GO(I8,))=I11E→E.+TGO(I8,+)=I6I9:E→E+T.T→T.*FGO(I9,)=I7I10:T→T*F.I11:F→(E).DFAI0:S'→.EE→.E+TE→.TT→.T*FT→.FF→.(E)F→.iI2:E→T.T→T*.FI5:F→i.I1:S'→E.E→E.+TI3:T→F.I4:F→(.E)E→.E+TE→.TT→.T*FT→.FF→.(E)F→.iI7:T→T*.FF→.(E)F.iI6:E→E+.TT→.T*FT→.FF→.(E)F→.iI8:F→(E.)E→E.+TI11:F→(E).I9:E→E+T.T→T.*FI10:T→T*F.i*EF(TiiiT+)*F(+F(E(F3、解决冲突可以看到,项目I1,I2,I9中都同时包含有移进项目和归约项目。存在移进—归约冲突,因而该文法不属于LR(0)文法,故不能构造LR(0)分析表。FOLLOW(S')={#} FOLLOW(E)={+,),#}FOLLOW(T)={+,*,),#}FOLLOW(F)={+,*,),#}现在分别考虑上述三个冲突项目中的冲突是否能用SLR(1)方法解决。在I1中,由于FOLLOW(S')={#).而S'→E.是唯一的接受项目,所以当且仅当遇到句子的结束符“#”号时才被接受,又因{#}∩{*}=φ,故I1中的冲突可解决。对于I2,因FOLLOW(E)={+,),#}∩{*}=φ,因此当面临输入符号为“+”,“)”或“#”号时,则用产生式E→T归约。当面临输入符为“*”时,则移进;其它情况则报错。对于I9,与I2类似,当面临输入符号为“+”,“)”或“#”时,则用产生式E→E+T归约;当面临输入符号为“*”时,则移进,其余情况报错。4、构造SLR(1)分析表对于上述三个冲突项目等均可用SLR(1)方法解决冲突。因此该文法是SLR(1)文法。我们可造成其相应的SLR(1)分析表为:i+*()#ETF0S5S41231S6acc2R2S7R2R23R4R4R4R44S5S48235R6R6R6R66S5S4937S5S4108S6S119R1S7R1R110R3R3R3R311R5R5R5R5下面给定输入串i+i*i#,使用上述SLR(1)分析进行分析:步状态栈符号栈输入串ACTIONGOTO10#i+i*i#S5205#i+i*i#R63303#F+i*i#R42402#T+i*i#R21501#E+i*i#S66016#E+i*i#S570165#E+i*i#R6380163#E+T*i#R4990169#E+T*i#S71001697#E+T*i#S511016975#E+T*i#R610120169710#E+T*F#R39130169#E+T#R111401#E#accLR分析器:LR分析器是一个确定的下推自动机。作为LR分析器的核心的分析表由两个子表组成:分析动作表ACTION和状态转移表GOTO.一个LR分析器如图:输入串#…ai…a1Sp→X1#S1S0┋┋┋┋XmSm总控程序输出ACTION表GOTO表其中S栈为状态栈X栈为符号栈栈安全阀基本知识如果压力容器(设备/管线等)压力超过设计压力…1.尽可能避免超压现象堵塞(BLOCKED)火灾(FIRE)热泄放(THERMALRELIEF)如何避免事故的发生?2.使用安全泄压设施爆破片安全阀如何避免事故的发生?01安全阀的作用就是过压保护!一切有过压可能的设施都需要安全阀的保护!这里的压力可以在200KG以上,也可以在1KG以下!设定压力(setpressure)安全阀起跳压力背压(backpressure)安全阀出口压力超压(overpressure)表示安全阀开启后至全开期间入口积聚的压力.几个压力概念弹簧式先导式重力板式先导+重力板典型应用电站锅炉典型应用长输管线典型应用罐区安全阀的主要类型02不同类型安全阀的优缺点结构简单,可靠性高适用范围广价格经济对介质不过分挑剔弹簧式安全阀的优点预漏--由于阀座密封力随介质压力的升高而降低,所以会有预漏现象--在未达到安全阀设定点前,就有少量介质泄出.100%SEATINGFORCE75502505075100%SETPRESSURE弹簧式安全阀的缺点过大的入口压力降会造成阀门的频跳,缩短阀门使用寿命.ChatterDiscGuideDiscHolderNozzle弹簧式安全阀的缺点弹簧式安全阀的缺点=10090807060500102030405010%OVERPRESSURE%BUILT-UPBACKPRESSURE%RATEDCAPACITY普通产品平衡背压能力差.在普通产品基础上加装波纹管,使其平衡背压的能力有所增强.能够使阀芯内件与高温/腐蚀性介质相隔离.平衡波纹管弹簧式安全阀的优点优异的阀座密封性能,阀座密封力随介质操作压力的升高而升高,可使系统在较高运行压力下高效能地工作.ResilientSeatP1P1P2先导式安全阀的优点平衡背压能力优秀有突开型/调节型两种动作特性可远传取压先导式安全阀的优点对介质比较挑剃,不适用于较脏/较粘稠的介质,此类介质会堵塞引压管及导阀内腔.成本较高.先导式安全阀的缺点重力板式产品的优点目前低压储罐呼吸阀/紧急泄放阀的主力产品.结构简单.价格经济.重力板式产品的缺点不可现场调节设定值.阀座密封性差,并有较严重的预漏.受背压影响大.需要很高的超压以达到全开.不适用于深冷/粘稠工况.几个常用规范ASMEsectionI-动力锅炉(FiredVessel)ASMEsectionVIII-非受火容器(UnfiredVessel)API2000-低压安全阀设计(LowpressurePRV)API520-火灾工况计算与选型(FireSizing)API526-阀门尺寸(ValveDimension)API527-阀座密封(SeatTightness)介质状态(气/液/气液双相).气态介质的分子量&Cp/Cv值.液态介质的比重/黏度.安全阀泄放量要求.设定压力.背压.泄放温度安全阀不以连接尺寸作为选型报价依据!如何提供高质量的询价?弹簧安全阀的结构弹簧安全阀起跳曲线弹簧安全阀结构弹簧安全阀结构导压管活塞密封活塞导向不平衡移动副(活塞)导管导阀弹性阀座P1P1P2先导式安全阀结构先导式安全阀的工作原理频跳安全阀的频跳是一种阀门高频反复开启关闭的现象。安全阀频跳时,一般来说密封面只打开其全启高度的几分只一或十几分之一,然后迅速回座并再次起跳。频跳时,阀瓣和喷嘴的密封面不断高频撞击会造成密封面的严重损伤。如果频跳现象进一步加剧还有可能造成阀体内部其他部分甚至系统的损伤。安全阀工作不正常的因素频跳后果1、导向平面由于反复高频磨擦造成表面划伤或局部材料疲劳实效。2、密封面由于高频碰撞造成损伤。3、由于高频振颤造成弹簧实效。4、由频跳所带来的阀门及管道振颤可能会破坏焊接材料和系统上其他设备。5、由于安全阀在频跳时无法达到需要的排放量,系统压力有可能继续升压并超过最大允许工作压力。安全阀工作不正常的因素A、系统压力在通过阀门与系统之间的连接管时压力下降超过3%。当阀门处于关闭状态时,阀门入口处的压力是相对稳定的。阀门入口压力与系统压力相同。当系统压力达到安全阀的起跳压力时,阀门迅速打开并开始泄压。但是由于阀门与系统之间的连接管设计不当,造成连接管内局部压力下降过快超过3%,是阀门入口处压力迅速下降到回座压力而导致阀门关闭。因此安全阀开启后没有达到完全排放,系统压力仍然很高,所以阀门会再次起跳并重复上述过程,既发生频跳。导致频跳的原因导致接管压降高于3%的原因1、阀门与系统间的连接管内径小于阀门入口管内径。2、存在严重的涡流现象。3、连接管过长而且没有作相应的补偿(使用内径较大的管道)。4、连接管过于复杂(拐弯过多甚至在该管上开口用作它途。在一般情况下安全阀入口处不允许安装其他阀门。)导致频跳的原因B、阀门的调节环位置设置不当。安全阀拥有喷嘴环和导向环。这两个环的位置直接影响安全阀的起跳和回座过程。如果喷嘴环的位置过低或导向环的位置过高,则阀门起跳后介质的作用力无法在阀瓣座和调节环所构成的空间内产生足够的托举力使阀门保持排放状态,从而导致阀门迅速回座。但是系统压力仍然保持较高水平,因此回座后阀门会很快再次起跳。导致频跳的原因C、安全阀的额定排量远远大于所需排量。
由于所选的安全阀的喉径面积远远大于所需,安全阀排放时过大的排量导致压力容器内局部压力下降过快,而系统本身的超压状态没有得到缓解,使安全阀不得不再次起跳频跳的原因阀门拒跳:当系统压力达到安全阀的起跳压力时,阀门不起跳的现象。安全阀工作不正常的因素1、阀门整定压力过高。2、阀门内落入大量杂质从而使阀办座和导套间卡死或摩擦力过大。3、弹簧之间夹入杂物使弹簧无法被正常压缩。4、阀门安装不当,使阀门垂直度超过极限范围(正负两度)从而使阀杆组件在起跳过程中受阻。5、排气管道没有被可靠支撑或由于管道受热膨胀移位从而对阀体产生扭转力,导致阀体内机构发生偏心而卡死。安全阀拒跳的原因阀门不回座或回座比过大:安全阀正常起跳后长时间无法回座,阀门保持排放状态的现象。安全阀工作不正常的因素1、阀门上下调整环的位置设置不当。2、排气管道设计不当造成排气不畅,由于排气管道过小、拐弯过多或被堵塞,使排放的蒸汽无法迅速排出而在排气管和阀体内积累,这时背压会作用在阀门内部机构上并产生抑制阀门关闭的趋势。3、阀门内落入大量杂质从而使阀瓣座和导套之间卡死后摩擦力过大。安全阀不回座或回座比过大的因素:4、弹簧之间夹入杂物从而使弹簧被正常压缩后无法恢复。5、由于对阀门排放时的排放反力计算不足,从而在排放时阀体受力扭曲损坏内部零件导致卡死。6、阀杆螺母(位于阀杆顶端)的定位销脱落。在阀门排放时由于振动使该螺母下滑使阀杆组件回落受阻。安全阀不回座或回座比过大的因素:7、由于弹簧压紧螺栓的锁紧螺母松脱,在阀门排放时由于振动时弹簧压紧螺栓松动上滑导致阀门的设定起跳值不断减小。
8、阀门安装不当,使阀门垂直度超过极限范围(正负两度)从而使阀杆组件在回落过程中受阻。
9、阀门的密封面中有杂质,造成阀门无法正常关闭。
10、锁紧螺母没有锁紧,由于管道震动下环向上运动,上平面高于密封面,阀门回座时无法密封安全阀不回座或回座比过大的因素:谢谢观看癌基因与抑癌基因oncogene&tumorsuppressorgene24135基因突变概述.癌基因和抗癌基因的概念.癌基因的分类.癌基因产物的作用.癌基因激活的机理主要内容疾病:
——是人体某一层面或各层面形态和功能(包括其物质基础——代谢)的异常,归根结底是某些特定蛋白质结构或功能的变异,而这些蛋白质又是细胞核中相应基因借助细胞受体和细胞中信号转导分子接收信号后作出应答(表达)的产物。TranscriptionTranslationReplicationDNARNAProtein中心法规Whatisgene?基因:
—是遗传信息的载体
—是一段特定的DNA序列(片段)
—是编码RNA或蛋白质的一段DNA片段
—是由编码序列和调控序列组成的一段DNA片段基因主宰生物体的命运:微效基因的变异——生物体对生存环境的敏感度变化关键关键基因的变异——生物体疾病——死亡所以才有:“人类所有疾病均可视为基因病”之说注:如果外伤如烧伤、骨折等也算疾病的话,外伤应该无法归入基因病的行列。Genopathy问:两个不相干的人,如果他们患得同一疾病,致病基因是否相同?再问:同卵双生的孪生兄弟,他们患病的机会是否一样,命运是否相同?┯┯┯┯
ATGC
TACG
┷┷┷┷┯┯┯┯┯
ATAGC
TATCG
┷┷┷┷┷┯┯┯┯
ATGC
TACG
┷┷┷┷┯┯┯
AGC
TCG
┷┷┷┯┯┯┯
ACGC
TGCG
┷┷┷┷┯┯┯┯
ATGC
TACG
┷┷┷┷增添缺失替换DNA分子(复制)中发生碱基对的______、______
和
,而引起的
的改变。替换增添缺失基因结构基因变异的概念:英语句子中的一个字母的改变,可能导致句子的意思发生怎样的变化?可能导致句子的意思不变、变化不大或完全改变THECATSATONTHEMATTHECATSITONTHEMATTHEHATSATONTHEMATTHECATONTHEMAT同理:替换、增添、缺失碱基对,可能会使性状不变、变化不大或完全改变。基因的结构改变,一定会引起性状的改变??原句:1.基因多态性与致病突变基因变异与疾病的关系2.单基因病、多基因病3.疾病易感基因
基因多态性polymorphism是指DNA序列在群体中的变异性(差异性)在人群中的发生概率>1%(SNP&CNP)<1%的变异概率叫做突变基因多态性特定的基因多态性与疾病相关时,可用致病突变加以描述SNP:散在单个碱基的不同,单个碱基的缺失、插入和置换。
CNP:DNA片段拷贝数变异,包括缺失、插入和重复等。同义突变、错义突变、无义突变、移码突变
致病突变生殖细胞基因突变将突变的遗传信息传给下一代(代代相传),即遗传性疾病。体细胞基因突变局部形成突变细胞群(肿瘤)。受精卵分裂基因突变的原因物理因素化学因素生物因素基因突变的原因(诱发因素)紫外线、辐射等碱基类似物5BU/叠氮胸苷等病毒和某些细菌等自发突变DNA复制过程中碱基配对出现误差。UV使相邻的胸腺嘧啶产生胸腺嘧啶二聚体,DNA复制时二聚体对应链空缺,碱基随机添补发生突变。胸腺嘧啶二聚体胸腺嘧啶胸腺嘧啶紫外线诱变物理诱变(physicalinduction)
5溴尿嘧啶(5BU)与T类似,多为酮式构型。间期细胞用酮式5BU处理,5BU能插入DNA取代T与A配对;插入DNA后异构成烯醇式5BU与G配对。两次DNA复制后,使A/T转换成G/C,发生碱基转换,产生基因突变。化学诱变(chemicalinduction)碱基类似物(baseanalogues)诱变AT5-BUA5-BUAAT5-BU5-BU(烯醇式)
(酮式)GGC1.生物变异的根本来源,为生物进化提供了最初的原始材料,能使生物的性状出现差别,以适应不同的外界环境,是生物进化的重要因素之一。2.致病突变是导致人类遗传病的病变基础。基因突变的意义概述:肿瘤细胞恶性增殖特性(一)肿瘤细胞失去了生长调节的反馈抑制正常细胞受损,一旦恢复原状,细胞就会停止增殖,但是肿瘤细胞不受这一反馈机制抑制。(二)肿瘤细胞失去了细胞分裂的接触抑制。正常细胞体外培养,相邻细胞相接触,长在一起,细胞就会停止增殖,而肿瘤细胞生长满培养皿后,细胞可以重叠起生长。(三)肿瘤细胞表现出比正常细胞更低的营养要求。(四)肿瘤细胞生长有一种自分泌作用,自己分泌生长需要的生长因子和调控信号,促进自身的恶性增殖。Whatisoncogene?癌基因——是基因组内正常存在的基因,其编码产物通常作为正调控信号,促进细胞的增殖和生长。癌基因的突变或表达异常是细胞恶性转化(癌变)的重要原因。——凡是能编码生长因子、生长因子受体、细胞内信号转导分子以及与生长有关的转录调节因子等的基因。如何发现癌基因的呢?11910年,洛克菲勒研究院一个年轻的研究员Rous发现,鸡肉瘤细胞裂解物在通过除菌滤器以后,注射到正常鸡体内,可以引起肉瘤,首次提出鸡肉瘤可能是由病毒引起的。0.2m孔径细菌过不去但病毒可以通过从病毒癌基因到细胞原癌基因的研究历程:Roussarcomavirus,RSVthefirstcancer-causingretrovirus1958年,Stewart和Eddy分离出一种病毒,注射到小鼠体内可以引起肝脏、肾脏、乳腺、胸腺、肾上腺等多种组织器官的肿瘤,因而把这种病毒称为多瘤病毒。50年代末、60年代初,癌病毒研究成了一个极
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度原材料采购合同标的质量保证2篇
- 有机化无水硫酸钙晶须改性沥青机理研究
- 合同模板系列分公司设立及承包经营合同
- 专业排烟管道安装合同合同范本
- 售后服务合同范本 2篇
- 工程安装项目社会责任与公益合同20243篇
- 在合同中提现补充协议书(2篇)
- 外企货物销售合同(2篇)
- 买卖手摩托车合同
- 2024年度教育培训与认证合同(标的:专业技能培训)2篇
- 五年级数学下册 第一单元观察物体(三)检测卷(拓展卷)(含答案)(人教版)
- 2024年合同法下反担保条款解读
- 2024年全国普法知识考试题库及答案
- 国开《液压传动和气压传动》实验报告1-4
- GB/T 7247.1-2024激光产品的安全第1部分:设备分类和要求
- 绵阳市高中2022级(2025届)高三第一次诊断性考试(一诊)历史试卷
- 湖南省湘东十校联盟2024-2025学年高三上学期10月联考英语试卷 含答案
- 东方电影学习通超星期末考试答案章节答案2024年
- 电子政务概论-形考任务5(在线测试权重20%)-国开-参考资料
- 新入职护士汇报
- 渗透测试基础教程介绍课件
评论
0/150
提交评论