版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译原理第四章第四章 语法分析语法分析自上而下分析自上而下分析1.2四元式四元式单词符号单词符号语法单位语法单位四元式四元式目标代码目标代码词法分析器词法分析器语法分析器语法分析器语义分析与中间代码生语义分析与中间代码生成器成器优化段优化段源程序源程序表表格格管管理理出出错错处处理理目标代码生成器目标代码生成器3第四章第四章 语法分析语法分析自上而下分析自上而下分析n本章主要介绍语法分析的处理本章主要介绍语法分析的处理n要进行语法分析,必须对语言的语法结构进行描述。要进行语法分析,必须对语言的语法结构进行描述。采用正规式和有限自动机可以描述和识别语言的单词符号;采用正规式和有限自动机可以描述和
2、识别语言的单词符号;用上下文无关文法来描述语法规则。用上下文无关文法来描述语法规则。4n上下文无关文法的定义:上下文无关文法的定义: 一个上下文无关文法一个上下文无关文法G G是一个四元式是一个四元式 G=(VG=(VT T,V VN N,S S,P)P),其中,其中V VT T:终结符集合:终结符集合( (非空非空) )V VN N:非终结符集合:非终结符集合( (非空非空) ),且,且V VT T V VN N= =S S:文法的开始符号,:文法的开始符号,S S V VN NP P:产生式集合:产生式集合( (有限有限) ),每个产生式形式为,每个产生式形式为P P, P P V VN
3、N, ( (V VT T V VN N) )* *开始符开始符S S至少必须在某个产生式的左部出现一次。至少必须在某个产生式的左部出现一次。5n例,定义只含例,定义只含+,*的算术表达式的文法的算术表达式的文法 G=, 其中,其中,P由下列产生式组成:由下列产生式组成:E iE E+EE E*EE (E)6n定义:称定义:称 A 直接推出直接推出,即,即 A 仅当仅当A 是一个产生式,是一个产生式, 且且 , (VT VN)* 。n如果如果 1 2 n,则我们称这个序列是从,则我们称这个序列是从 1到到 n的一个推导。若存的一个推导。若存在一个从在一个从 1到到 n的推导,则称的推导,则称 1
4、可以推导出可以推导出 n 。n例:对文法例:对文法(1)E (E) (E+E) (i+E) (i+i)7n通常,用通常,用 表示:从表示:从 1 1出发,经过一步或若干步,可以推出出发,经过一步或若干步,可以推出 n n。n1n*1 用用 表示:从表示:从 1 1出发,经过出发,经过0 0步或若干步,可以推出步或若干步,可以推出 n n。* 所以所以 : 即即 或或,|)(*TV SGLq定义:假定定义:假定G G是一个文法,是一个文法,S S 是它的开始符号。如果是它的开始符号。如果 ,则,则 称是一个称是一个句句型型。仅含终结符号的句型是一个。仅含终结符号的句型是一个句子句子。文法。文法G
5、 G所产生的句子的全体是一个所产生的句子的全体是一个语言语言,将,将它记为它记为 L(G)L(G)。*S 84.1 语法分析器的功能语法分析器的功能n语法分析的任务是分析一个文法的句子结构。语法分析的任务是分析一个文法的句子结构。n语法分析器的功能:按照文法的产生式语法分析器的功能:按照文法的产生式( (语言的语法规则语言的语法规则) ),识别输入符,识别输入符号串是否为一个句子号串是否为一个句子( (程序程序) )。9源程序源程序单词符号单词符号取下一单词取下一单词.语法分语法分析树析树词法分词法分析器析器语法分语法分析器析器符号表符号表编译程序编译程序后续部分后续部分10n语法分析的方法:
6、语法分析的方法:自下而上分析法自下而上分析法(Bottom-up)(Bottom-up)n基本思想:从输入串开始,逐步进行基本思想:从输入串开始,逐步进行“归约归约”,直到文法的开始符号。即,直到文法的开始符号。即从树末端开始,构造语法树。所谓归约,是指根据文法的产生式规则,从树末端开始,构造语法树。所谓归约,是指根据文法的产生式规则,把产生式的右部替换成左部符号。把产生式的右部替换成左部符号。n算符优先分析法:按照算符的优先关系和结合性质进行语法分析。适合算符优先分析法:按照算符的优先关系和结合性质进行语法分析。适合分析表达式。分析表达式。nLRLR分析法:规范归约分析法:规范归约11G(E
7、): E i| E+E | E-E | E*E | E/E | (E) i*i+i E*i+i E*E+i E+i E+E Ei+ +* *EiiEEEE12n语法分析的方法:语法分析的方法:自下而上分析法自下而上分析法(Bottom-up)(Bottom-up)自上而下分析法自上而下分析法(Top-down)(Top-down)n基本思想:它从文法的开始符号出发,反复使用各种产生式,寻找基本思想:它从文法的开始符号出发,反复使用各种产生式,寻找 匹配匹配 的的推导推导。n递归下降分析法:对每一语法变量递归下降分析法:对每一语法变量( (非终结符非终结符) )构造一个相应的子程构造一个相应的子
8、程序,每个子程序识别一定的语法单位,通过子程序间的信息反馈和序,每个子程序识别一定的语法单位,通过子程序间的信息反馈和联合作用实现对输入串的识别。联合作用实现对输入串的识别。n预测分析程序预测分析程序F优点:直观、简单和宜于手工实现。优点:直观、简单和宜于手工实现。134.2.1 自上而下分析面临的问题自上而下分析面临的问题n自上而下就是从文法的开始符号出发,向下自上而下就是从文法的开始符号出发,向下推导推导,推出句子。,推出句子。带带“回溯回溯”的的不带回溯的递归子程序不带回溯的递归子程序(递归下降递归下降)分析方法。分析方法。n自上而下分析的主旨:对任何输入串,试图用一切可能的办法,从文法
9、开始自上而下分析的主旨:对任何输入串,试图用一切可能的办法,从文法开始符号符号(根结点根结点)出发,自上而下地为输入串建立一棵出发,自上而下地为输入串建立一棵语法树语法树。或者说,为输入。或者说,为输入串寻找一个最左推导。串寻找一个最左推导。14n例例4.1 假定有文法假定有文法G(S): (1) SxAy (2) A*|* 分析分析输入串输入串x*y(记为记为 )。Sx*yIPSx*yIPAxySx*yIPAxySx*yIPAxy*Sx*yIPAxy*Sx*yIPAxy*Sx*yIPAxy*15例例 假定有文法假定有文法GS: SSb GS: SSb Sa L=abSa L=abn n |
10、n1 | n1W=abbb W=abbb S S b S b 16n当某个非终结符有多个产生式候选时,可能带来如下问题当某个非终结符有多个产生式候选时,可能带来如下问题: :1. 1. 分析过程中,当一个非终结符用某一个候选匹配成功时,这种匹配可分析过程中,当一个非终结符用某一个候选匹配成功时,这种匹配可能是暂时的能是暂时的。出错。出错时时,不得不,不得不“回溯回溯”。2. 2. 文法左递归问题文法左递归问题。一个文法是含有左递归的,如果存在非终结符一个文法是含有左递归的,如果存在非终结符P PPP含有左递归的文法将使自上而下的分析陷入无限循环。含有左递归的文法将使自上而下的分析陷入无限循环。
11、174.2.2 左递归的消除、回溯的消除左递归的消除、回溯的消除n构造不带回溯的自上而下分析算法构造不带回溯的自上而下分析算法要消除文法的左递归性要消除文法的左递归性克服回溯克服回溯184.2.2 左递归的消除左递归的消除n直接消除见诸于产生式中的左递归:假定关于非终结符直接消除见诸于产生式中的左递归:假定关于非终结符P的规则为的规则为PP | 其中其中 不以不以P开头。开头。 我们可以把我们可以把P的规则等价地改写为如下的非直接左递归形式:的规则等价地改写为如下的非直接左递归形式:P P P P | 左递归变右递归19n一般而言,假定一般而言,假定P关于的全部产生式是关于的全部产生式是PP
12、1 | P 2 | | P m | 1 | 2| n其中,每个其中,每个 都不等于都不等于 ,每个,每个 都不以都不以P开头开头 那么,消除那么,消除P的直接左递归性就是把这些规则改写成:的直接左递归性就是把这些规则改写成: P 1P | 2P | | nP P 1P | 2P | | mP | 左递归变右递归20n例例 文法文法G(E):EET | TTT*F | FF(E) | i经消去直接左递归后变成:经消去直接左递归后变成: ETE E +TE | TFT T *FT | F(E) | i(4.2)PP 1 | P 2 | | P m | 1 | 2| nP 1P | 2P | | n
13、P P 1P | 2P | | mP | 21n例如文法例如文法G(S):SQc|cQRb|bRSa|a (4.3)虽没有直接左递归,但虽没有直接左递归,但S、Q、R都是左递归的都是左递归的SQcRbcSabc一个文法消除左递归的条件:一个文法消除左递归的条件:F不含以不含以 为右部的产生式为右部的产生式F不含回路。不含回路。PP22n消除左递归的算法消除左递归的算法:1. 把文法把文法G的所有非终结符按任一种顺序排列成的所有非终结符按任一种顺序排列成P1,P2,Pn;按此顺序;按此顺序执行;执行;2. FOR i:=1 TO n DO BEGIN FOR j:=1 TO i-1 DO 把形如
14、把形如PiPj 的规则改写成的规则改写成 Pi 1 | 2 | k ; (其中其中Pj 1| 2| k是关于是关于Pj的所有规则的所有规则) 消除关于消除关于Pi规则的直接左递归性规则的直接左递归性 END3. 化简由化简由2所得的文法。去除那些从开始符号出发永远无法到达的非终结符所得的文法。去除那些从开始符号出发永远无法到达的非终结符的产生规则。的产生规则。23n例例 考虑文法考虑文法G(S)SQc|cQRb|bRSa|an令它的非终结符的排序为令它的非终结符的排序为R、Q、S。n对于对于R,不存在直接左递归。,不存在直接左递归。n把把R代入到代入到Q的有关候选后,把的有关候选后,把Q的规则
15、变为的规则变为 QSab | ab | b24n例例 考虑文法考虑文法G(S)SQc|cQRb|bRSa|an令它的非终结符的排序为令它的非终结符的排序为R、Q、S。nQ的规则变为的规则变为 QSab | ab | bn现在的现在的Q不含直接左递归,把它代入到不含直接左递归,把它代入到S的有关候选后,的有关候选后,S变成变成SSabc | abc | bc | c25n例例 考虑文法考虑文法G(S)SQc|cQRb|bRSa|anS变成变成SSabc | abc | bc | cn消除消除S的直接左递归后:的直接左递归后:SabcS | bcS | cS S abcS | QSab |ab |
16、 bRSa|a26n例例 考虑文法考虑文法G(S)SQc|cQRb|bRSa|an消除消除S的直接左递归后:的直接左递归后:SabcS | bcS | cS S abcS | QSab |ab | bRSa|an关于关于Q和和R的规则已是多余的,化简为:的规则已是多余的,化简为:SabcS | bcS | cS S abcS | (4.4)27n注意,由于对非终结符排序的不同,最后所得的文法在形式上可能不一注意,由于对非终结符排序的不同,最后所得的文法在形式上可能不一样。但不难证明,它们都是等价的。样。但不难证明,它们都是等价的。n例如,若对文法例如,若对文法(4.3)的非终结符排序选为的非终
17、结符排序选为S、Q、R,那么,最后所得的,那么,最后所得的无左递归文法是:无左递归文法是:SQc | cQRb | bRbcaR | caR |a R (4.5)R bca R | n文法文法(4.4)和和(4.5)的等价性是显然的。的等价性是显然的。284.2.4 消除回溯、提左因子消除回溯、提左因子n为了消除回溯就必须保证:对文法的任何非终结符,当要它去匹配输入为了消除回溯就必须保证:对文法的任何非终结符,当要它去匹配输入串时,能够根据它所面临的输入符号准确地指派它的一个候选去执行任串时,能够根据它所面临的输入符号准确地指派它的一个候选去执行任务,并且此候选的工作结果应是确信无疑的。务,并
18、且此候选的工作结果应是确信无疑的。nA 1 | 2 | | nSa.IPA.29n令令G是一个不含左递归的文法,对是一个不含左递归的文法,对G的所有非终结符的每个候选的所有非终结符的每个候选 定义它的定义它的终结首符集终结首符集FIRST( )为:为:.,|=)(*TVaaaFIRST 特别是,若特别是,若 ,则规定,则规定FIRST( )。* 如果非终结符如果非终结符A的所有候选首符集两两不相交,即的所有候选首符集两两不相交,即A的任何两个不同候选的任何两个不同候选 i和和 jFIRST( i)FIRST( j) 当要求当要求A匹配输入串时,匹配输入串时,A就能根据它所面临的第一个输入符号就
19、能根据它所面临的第一个输入符号a,准确地指派某,准确地指派某一个候选前去执行任务。这个候选就是那个终结首符集含一个候选前去执行任务。这个候选就是那个终结首符集含a的的 。30n提取公共左因子提取公共左因子: 假定关于假定关于A的规则是的规则是 A 1 | 2 | | n | 1 | 2 | | m (其中,每个其中,每个 不以不以 开开头头) 那么,可以把这些规则改写成那么,可以把这些规则改写成A A | 1 | 2 | | mA 1 | 2 | | nn经过反复提取左因子,就能够把每个非终结符经过反复提取左因子,就能够把每个非终结符(包括新引进者包括新引进者)的所有候选的所有候选首符集变成为
20、两两不相交。首符集变成为两两不相交。31n ETE E +TE | TFT T *FT | F(E) | in i + i4.2.4 LL(1)分析条件分析条件32i + i IPEnG(E): ETE E +TE | TFT T *FT | F(E) | i33i + i IPETEnG(E): ETE E +TE | TFT T *FT | F(E) | i34i + i IPETEFTnG(E): ETE E +TE | TFT T *FT | F(E) | i35i + i IPETEFTinG(E): ETE E +TE | TFT T *FT | F(E) | i36i + i I
21、PETEFTinG(E): ETE E +TE | TFT T *FT | F(E) | i37i + i IPETEFTi nG(E): ETE E +TE | TFT T *FT | F(E) | i38i + i IPETEFTi +TEnG(E): ETE E +TE | TFT T *FT | F(E) | i39i + i IPETEFTi +TEnG(E): ETE E +TE | TFT T *FT | F(E) | i40i + i IPETEFTi +TEFTnG(E): ETE E +TE | TFT T *FT | F(E) | i41i + i IPETEFTi +T
22、EFTinG(E): ETE E +TE | TFT T *FT | F(E) | i42i + i IPETEFTi +TEFTinG(E): ETE E +TE | TFT T *FT | F(E) | i43i + i IPETEFTi +TEFTi nG(E): ETE E +TE | TFT T *FT | F(E) | i44i + i IPETEFTi +TEFTi nG(E): ETE E +TE | TFT T *FT | F(E) | iS T+45n假定假定S是文法是文法G的开始符号,对于的开始符号,对于G的任何非终结符的任何非终结符A,我们定义,我们定义.,.|)(*T
23、VaAaSaAFOLLOWAS*特别是,若特别是,若 ,则规定,则规定 FOLLOW(A)4.2.4 LL(1)分析条件分析条件46n构造不带回溯的自上而下分析的文法条件构造不带回溯的自上而下分析的文法条件1. 文法不含左递归,文法不含左递归,2. 对于文法中每一个非终结符对于文法中每一个非终结符A的各个产生式的候选首符集两两不相交。即的各个产生式的候选首符集两两不相交。即,若,若A 1| 2| n 则则 FIRST( i)FIRST( j) (i j)3. 对文法中的每个非终结符对文法中的每个非终结符A,若它存在某个候选首符集包含,若它存在某个候选首符集包含 ,则,则FIRST( i)FOL
24、LOW(A)= i=1,2,.,n如果一个文法如果一个文法G满足以上条件,则称该文法满足以上条件,则称该文法G为为LL(1)LL(1)文法文法。47n对于一个满足上述条件的文法,可以对其输入串进行有效的无回溯的自上而下对于一个满足上述条件的文法,可以对其输入串进行有效的无回溯的自上而下分析。假设要用非终结符分析。假设要用非终结符A进行匹配,面临的输入符号为进行匹配,面临的输入符号为a,A的所有产生式为的所有产生式为A 1 | 2 | | n1. 若若a FIRST( i),则指派,则指派 i执行匹配任务;执行匹配任务;2. 若若a不属于任何一个候选首符集,则:不属于任何一个候选首符集,则: (
25、1) 若若 属于某个属于某个FIRST( i )且且 a FOLLOW(A), 则让则让A与与 自动匹配。自动匹配。 (2) 否则,否则,a的出现是一种语法错误。的出现是一种语法错误。48.,|=)(*TVaaaFIRST4.2.6 构造构造FIRST( )若若* 则规定则规定 FIRST( )直观上说文法符号串直观上说文法符号串 的开始符号集是由的开始符号集是由 推导出的开头的终结符推导出的开头的终结符(包括(包括)组成。)组成。 49n例文法例文法GS: SApSBqAaAcABbBdBFIRST(Ap)=a,cFIRST(Bq)=b,dFIRST(a)=a FIRST(cA)=cFIRS
26、T(b)=bFIRST(dB)=d由于同一非终结符的两个产生式的右部推导出来的开始符号集不相交,因此可根由于同一非终结符的两个产生式的右部推导出来的开始符号集不相交,因此可根据当前输入符属于哪个产生式右部的开始符号集而决定选哪个产生式进行推导,据当前输入符属于哪个产生式右部的开始符号集而决定选哪个产生式进行推导,可以进行确定的自顶向下分析可以进行确定的自顶向下分析50n对每一文法符号对每一文法符号X VTVN构造构造FIRST(X) 连续使用下面的规则,直至每个集合连续使用下面的规则,直至每个集合FIRST不再增大为止:不再增大为止:1. 若若X VT,则,则FIRST(X)X。2. 若若X
27、VN,且有产生式,且有产生式Xa,则把,则把a加入到加入到FIRST(X)中;若中;若X 也是一也是一条产生式,则把条产生式,则把 也加到也加到FIRST(X)中。中。513. l若若XY是一个产生式且是一个产生式且Y VN,则把,则把FIRST(Y)中的所有非中的所有非 -元素都加到元素都加到FIRST(X)中;中;l若若XY1Y2Yk是一个产生式,是一个产生式,Y1,Yi-1都是非终结符,而且,对于任都是非终结符,而且,对于任何何j,1 j i-1,FIRST(Yj)都含有都含有 (即即Y1Yi-1 ), 则把则把FIRST(Yi)中的所有非中的所有非 -元素都加到元素都加到FIRST(X
28、)中;特别是,若所有的中;特别是,若所有的FIRST(Yj)均含有均含有 ,j1,2,k,则把,则把 加到加到FIRST(X)中。中。52n对文法对文法G的任何符号串的任何符号串 =X1X2Xn构造集合构造集合FIRST( )。1. 置置FIRST( )FIRST(X1) ;2. 若对任何若对任何1 j i-1,FIRST(Xj),则把,则把FIRST(Xi) 加至加至FIRST( )中;中;特别是,若所有的特别是,若所有的FIRST(Xj)均含有均含有 ,1 j n,则把,则把 也加至也加至FIRST( )中。显然,若中。显然,若 则则FIRST( ) 。53n例例4.6 对于文法对于文法G
29、(E)ETE E +TE | TFT T *FT | F(E) | i | x构造每个非终结符的构造每个非终结符的FIRST:54x xi i(,i,x*,(,i,x+,(,i,xFirstFirst集集(3)(3)x xi i(,i,x*,(,i,x+,(,i,xFirstFirst集集(2)(2)x xi i (,i,x+,FirstFirst集集(1)(1)E E T TT TF Fi ix xE E*,(,i,xi ix x+,FirstFirst集集(0)(0) * *, , (,i,x55.,.|)(*TVaAaSaAFOLLOW4.2.6 构造构造FOLLOW(A)若有若有S=*
30、 A,则规定,则规定 # FOLLOW(A)(注:(注: # 输入串输入串#,#做为输入串的结束符)做为输入串的结束符)直观上说直观上说,非终结符非终结符A的后跟符号集是由句型中紧跟的后跟符号集是由句型中紧跟A后的那些终结符后的那些终结符(包括(包括#)组成。)组成。56n例例 文法文法G S:SaA|d AbAS|由由 S=* S 得得 # FOLLOW(S) 由由S=aA=abAS=abbASS=abbASaA =abbASd FOLLOW(S)=#,a,d由由S=* aA 得得 # FOLLOW(A) 由由S=* abAS=* abAaA 得得 a FOLLOW(A) =* abAd 得
31、得 d FOLLOW(A) FOLLOW(A)=#,a,d57n对于文法对于文法G的每个非终结符的每个非终结符A构造构造FOLLOW(A)的办法是,连续使用下面的办法是,连续使用下面的规则,直至每个的规则,直至每个FOLLOW不再增大为止:不再增大为止:1. 对于文法的开始符号对于文法的开始符号S,置于,置于FOLLOW(S)中;中;2. 若若A B 是一个产生式,则把是一个产生式,则把FIRST( ) 加至加至FOLLOW(B)中;中;3. 若若A B是一个产生式,或是一个产生式,或AB 是一个产生式而是一个产生式而 (即即FIRST( ), 则把则把FOLLOW(A)加至加至FOLLOW(
32、B)中。中。58n例例4.6 对于文法对于文法G(E)ETE E +TE | TFT T *FT | F(E) | i | x构造每个非终结符的构造每个非终结符的FOLLOW集:集:59*,+,#,)+,#,)+,#,)#,)#,)FollowFollow集集(2)(2) +,#,)#,)#,)FollowFollow集集(1)(1)E E T TT TF FE E*+#,)FollowFollow集集(0)(0)+,#,)*,+,#,)60n例例4.6 对于文法对于文法G(E)ETE E +TE | TFT T *FT | F(E) | i构造每个非终结符的构造每个非终结符的FIRST和和F
33、OLLOW集合:集合: FIRST(E) =(,iFIRST(E )=+, FIRST(T) =(,iFIRST(T )=*, FIRST(F) =(,i FOLLOW(E) =),#FOLLOW(E )=),#FOLLOW(T) =+,),#FOLLOW(T )=+,),#FOLLOW(F) =*,+,),#614.2.7 预测分析程序预测分析程序一、预测分析程序工作原理一、预测分析程序工作原理n if(a FIRST( i) 用用A i推导推导n else if(a FOLLOW(A)用用A 推导推导n else 语法错误语法错误n预测分析程序或预测分析程序或LL(1)分析法:分析法:总控
34、程序总控程序分析表分析表 MA,a矩阵,矩阵,A VN ,a VT 是终结符或是终结符或,分析栈分析栈 STACK 用于存放文法符号用于存放文法符号62总控程序总控程序分析表分析表X#输入串输入串分析栈分析栈STACKa1a2.ai#预测分析程序的工作图预测分析程序的工作图# Sa1a2.ai#分析开始时:分析开始时:输出流输出流63q 总控程序根据现行栈顶符号总控程序根据现行栈顶符号X和当前输入符号和当前输入符号a,执行下列三种动作之一,执行下列三种动作之一:1. 若若Xa,则宣布分析成功,停止分析。,则宣布分析成功,停止分析。2. 若若Xa ,则把,则把X从从STACK栈顶逐出,让栈顶逐出
35、,让a指向下一个输入符号。指向下一个输入符号。匹配成功643. 若若X是一个非终结符,则查看分析表是一个非终结符,则查看分析表M。 若若MX,a中存放着关于中存放着关于X的一个产生式,把的一个产生式,把X逐出逐出STACK栈顶,栈顶,把把产生式的右部符号串按反序一一推进产生式的右部符号串按反序一一推进STACK栈栈(若右部符号为若右部符号为 ,则,则意味不推什么东西进栈意味不推什么东西进栈)。在把产生式的右部符号推进栈的同时应做。在把产生式的右部符号推进栈的同时应做这个产生式相应的语义动作。这个产生式相应的语义动作。若若MX,a中存放着中存放着“出错标志出错标志”,则调用出错诊察程序,则调用出
36、错诊察程序ERROR。推导65预测分析程序流程预测分析程序流程上托栈顶符放入上托栈顶符放入XNYYNNNN YY Y把把#和文法开始符压入分析栈;和文法开始符压入分析栈; 当前输入符送当前输入符送a把产生式右部反把产生式右部反序进栈序进栈XVT ?X=# ? X=a ?X=a?读下一输入读下一输入符到符到aMX,a有产生式有产生式?出错出错结束结束出错出错预测分析程序工作过程预测分析程序工作过程66n预测分析程序的总控程序:预测分析程序的总控程序:BEGIN 首先把首先把然后把文法开始符号推进然后把文法开始符号推进STACK栈;栈; 把第一个输入符号读进把第一个输入符号读进a; FLAG:=T
37、RUE; WHILE FLAG DOBEGIN 把把STACK栈顶符号上托出去并放在栈顶符号上托出去并放在X中;中; IF X VT THEN IF X= a THEN 把下一输入符号读进把下一输入符号读进a ELSE ERROR 匹配成功67 ELSE IF X=# THEN IF X=a THEN FLAG:=FALSE ELSE ERROR ELSE IF MX,a=XX1X2XkTHEN 把把Xk,Xk-1,X1一一推进一一推进STACK栈栈 /* 若若X1X2Xk= ,不推什么进栈,不推什么进栈 */ ELSE ERROR END OF WHILE;STOP /*分析成功,过程完毕分
38、析成功,过程完毕*/END分析成功推导68n例例4.6 对于文法对于文法G(E)ETE E +TE | TFT T *FT | F(E) | i输入串为输入串为i1*i2+i3,利用分析表进行预测分析:,利用分析表进行预测分析:i+*()#EETE ETE E E +TE E E TTFT TFT T T T *FT T T FFiF (E)69步骤步骤符号栈符号栈输入串输入串所用产生式所用产生式0#Ei1*i2+i3#1#E Ti1*i2+i3# ETE 2#E T Fi1*i2+i3# TFT 3#E T ii1*i2+i3# Fii+*()#EETE ETE E E +TE E E TT
39、FT TFT T T T *FT T T FFiF (E)70步骤步骤符号栈符号栈输入串输入串所用产生式所用产生式3#E T ii1*i2+i3# Fi4#E T *i2+i3#5#E T F* *i2+i3# T *FT 6#E T F i2+i3#7#E T ii2+i3# Fii+*()#EETE ETE E E +TE E E TTFT TFT T T T *FT T T FFiF (E)71步骤步骤符号栈符号栈输入串输入串所用产生所用产生7#E T ii2+i3# Fi 8#E T +i3#9#E +i3# T 10#E T+i3# E +TE 11#E Ti3#i+*()#EETE
40、 ETE E E +TE E E TTFT TFT T T T *FT T T FFiF (E)72步骤步骤符号栈符号栈输入串输入串所用产生所用产生11#E Ti3#12#E T F i3# TFT 13#E T ii3# Fi14#E T #15#E # T 16# E i+*()#EETE ETE E E +TE E E TTFT TFT T T T *FT T T FFiF (E)73二、分析表二、分析表MA,a的构造的构造q构造构造FIRST( )和和FOLLOW(A)q构造分析表构造分析表MA,a74n例例4.6 对于文法对于文法G(E)ETE E +TE | TFT T *FT |
41、 F(E) | i构造每个非终结符的构造每个非终结符的FIRST和和FOLLOW集合:集合: FIRST(E) =(,iFIRST(E )=+, FIRST(T) =(,iFIRST(T )=*, FIRST(F) =(,i FOLLOW(E) =),#FOLLOW(E )=),#FOLLOW(T) =+,),#FOLLOW(T )=+,),#FOLLOW(F) =*,+,),#75n在对文法在对文法G的每个非终结符的每个非终结符A及其任意候选及其任意候选 都构造出都构造出FIRST( )和和FOLLOW(A)之后,现在可以用它们来构造之后,现在可以用它们来构造G的分析表的分析表MA,a。1.
42、 对文法对文法G的每个产生式的每个产生式A 执行第执行第2步和第步和第3步;步;2. 对每个终结符对每个终结符a FIRST( ),把,把A 加至加至MA,a中;中;3. 若若FIRST( ),则对任何,则对任何b FOLLOW(A)把把A 加至加至MA,b中。中。4. 把所有无定义的把所有无定义的MA,a标上标上“出错标志出错标志”。76i+*()#EETE ETE E E +TE E E TTFT TFT T T T *FT T T FFiF (E)77n如果如果G是左递归或二义的,那么,是左递归或二义的,那么,M至少含有一个多重定义入口。因此,至少含有一个多重定义入口。因此,消除左递归和
43、提取左因子将有助于获得无多重定义的分析表消除左递归和提取左因子将有助于获得无多重定义的分析表M。n可以证明,一个文法可以证明,一个文法G的预测分析表的预测分析表M不含多重定义入口,当且仅当该不含多重定义入口,当且仅当该文法为文法为LL(1)的。的。78G(S):S iCtS | iCtSeS | aC b提取左因子之后,改写成:提取左因子之后,改写成:G(S):S iCtSS | aS eS | C babeit#SSaSiCtSS S S S eSS CCbF (E)最近匹配原则 794.2.10 递归下降分析递归下降分析程序构造程序构造n构造不带回溯的自上而下分析程序构造不带回溯的自上而下
44、分析程序要消除文法的左递归性要消除文法的左递归性克服回溯克服回溯80q实现思想:实现思想:对文法中的每个非终结符编写一个递归过程,识别由该非终结符推出的对文法中的每个非终结符编写一个递归过程,识别由该非终结符推出的串。当非终结符有多条产生式时,按当前输入符属于哪条产生式的串。当非终结符有多条产生式时,按当前输入符属于哪条产生式的FIRST集或集或FOLLOW集(集(A )可唯一确定选择哪个产生式进行匹配。)可唯一确定选择哪个产生式进行匹配。当识别到终结符时,与当前输入符号匹配,并读取下一输入符;当识别到终结符时,与当前输入符号匹配,并读取下一输入符;当识别到非终结符时,则调用该非终结符相应的过
45、程。当识别到非终结符时,则调用该非终结符相应的过程。81n例例 算术表达式文法算术表达式文法G: ETE E+TE TFT T*FTF(E)i判断判断G是是LL(1)文法文法1 判断是否可以应用递归子程序法判断是否可以应用递归子程序法822 构造文法构造文法G的递归下降分析器的递归下降分析器n定义:定义:当一个文法满足当一个文法满足LL(1)LL(1)条件时,就为它构造一个不带回溯的自顶向下的分析程条件时,就为它构造一个不带回溯的自顶向下的分析程序,这个分析程序由一组递归过程组成,每个过程对应文法的一个非终结符。序,这个分析程序由一组递归过程组成,每个过程对应文法的一个非终结符。这样的一个分析
46、程序称为递归下降分析器。这样的一个分析程序称为递归下降分析器。83n组成:组成:递归下降分析器由一个主程序递归下降分析器由一个主程序MAINMAIN和每个非终结符对应的一个递归过程组成。和每个非终结符对应的一个递归过程组成。用到的一些子过程:用到的一些子过程:过程过程GETNEXTGETNEXT负责读入下一个负责读入下一个TOKENTOKEN字字过程过程ERRORERROR负责报告语法错误负责报告语法错误约定:约定:变量变量TOKENTOKEN存放已读入的存放已读入的TOKENTOKEN字字过程进入时变量过程进入时变量TOKENTOKEN存放了一个待匹配的存放了一个待匹配的TOKENTOKEN
47、字字退出过程时,变量退出过程时,变量TOKENTOKEN中仍存放着一个待匹配的中仍存放着一个待匹配的TOKENTOKEN字。字。 84非终结符相应的分析子程序的构造方法非终结符相应的分析子程序的构造方法对于每个非终结符对于每个非终结符U,编写一个相应的子程序,编写一个相应的子程序P(U);对于产生式对于产生式Ux1 | x2 |xn,x1,.xn都都 关于关于U的子程序的子程序P(U)按如下方法构造:按如下方法构造:if TOKEN in first(x1) then p(x1) else if TOKEN in first(x2) then p(x2) else . if TOKEN in
48、first(xn) then p(xn) else ERROR85如果如果U还有空产生式还有空产生式U ,则算法中的语句:则算法中的语句:if TOKEN in first(xn) then p(xn) else ERROR改写为改写为if TOKEN in first(xn) then p(xn) else if TOKEN not in follow(U) then ERROR对于符号串对于符号串x=y1y2yn;p(x)的含义为:的含义为:begin p(y1);p(y2);p(yn) end如果如果yiVN,则,则P(yi)就代表调用就代表调用yi的子程序;的子程序;yiVT T,则,
49、则P(yi)为形如下述语句的一段为形如下述语句的一段程序程序if TOKEN=yi then GETNEXT(TOKEN) else ERROR86(1) program MAIN; /* 主程序主程序 */ begin GETNEXT (TOKEN); E (TOKEN); /* 转匹配转匹配ETE */ if TOKEN # then ERROR end. 构造文法构造文法G:ETE E+TE TFT T*FTF(E)i的递归下降分析器的递归下降分析器(2) procedure E (TOKEN); /*匹配匹配ETE*/ begin T (TOKEN); /*转匹配转匹配TFT*/ E (TOKEN) /*转匹配转匹配E+TE*/ end; 87(3) procedure E (TOKEN); /*匹配匹配E+TE*/ begin if TOKEN=+ then /*选择产生式选择产生式E+TE*/ begin GETNEXT (TOKEN);/*匹配匹配+,读下一个读下一个TOKEN字字*/ T (TOKEN); /*转匹配转匹配TFT*/ E (TOKEN) /*转匹配转匹配E+TE*/ end else /*E对应的语句对应的语句*/if TOKEN) and TOKEN# then ER
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化工消防安全工作总结(6篇)
- 污染治理产业政策研究-洞察分析
- 休闲时间分配与生活满意度-洞察分析
- 无线鼠标技术发展-洞察分析
- 网络安全技术创新-第5篇-洞察分析
- 游戏版权保护策略-洞察分析
- 微种植体支抗的骨整合机制-洞察分析
- 应急响应与处置能力建设-洞察分析
- 网络安全法律法规-第16篇-洞察分析
- 《真核生物真菌》课件
- 中班语言《新房子》3--完整版PPT课件(24页PPT)
- 高电压技术:5-2绝缘电阻、吸收比、泄漏电流的测量
- 王守仁英国文学选读课后答案
- (完整版)20以内带括号加减法口算练习
- 奥星-计算机化系统验证要点分析与校准管理
- 北京九强生物技术股份有限公司新建研发中心及参考试验室项目环境影响评价报告书简本
- 新浙美版三年级上册美术教案
- 中国国际商会入会申请表
- 裂隙灯显微镜的原理
- 心脏彩超电子病例检查模块
- 洪水计算(推理公式法)
评论
0/150
提交评论