词法与语法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
词法与语法

4 4 语法分析和语法分析程序 4.1 重点和难点 4.1.1 语法分析程序的功能 语法分析程序又简称称为分析器,它以单词串形式的源程序作为输入或分析的对象,其基本任务是:根据程序设计语言的语法规则(即定义该语言的前后文无关文法),分析源程序的语法结构,即分析如何由这些单词组成该源程序的各种语法成分(如下标变量、函数、各种表达式、各程语句等等),并在分析过程中进行语法正确性检查,产生内部形式的中间代码,供编译程序后续阶段处理。 目前,已存在许多语法分析方面的方法,但就产生语法树的方向而言,可大致把它们分为自顶向下分析和自底向上分析两大类。 4.1.2 自顶向下的语法分析 所谓自顶向下的语法分析,是指对于给定输入串w,试图为其构造一个从文法开始符号到w的最左推导,或为w自上而下地构造一棵以S为根结点的语法树。如果这一尝试得到成功,则证明w是相应文法的一个句子;反之,则不是。 在进行自顶向下的语法分析时,通常有下列两个障碍须加以解决: (1)由于采取了最左推导,故当相应方法法G中含有左递归的非终结符号时,便会使语法分析过程陷入循环不已的状况。 (2)采用最左推导以实现对符号串w的匹配,实际上是一个用文法产生式的诸候选式反复进行试探的过程,这势必会出现大量的回溯,从而导致语法分析效率的大幅度下降。 因此,欲实现自顶向下的语法分析,其首要任务是改造程序设计语言的文法,以消除其中的左递归和避免回溯的出现。 1.消除文法的左递归 如果一个文法G[S]=(VN,VT,P,S)中的A-产生式具有如下的形式: A→Aα1|Aα2|…|Aαn|β1|β2|…|βm 其中每个βi均不以A打头,则A是一个直接左递归的非终结符号。为消除此种左递归,可引入一个新的非终结符号A’,并将上述A-产生式改写为 A→β1A’|β2A’|…|βmA A’→α1 A’|α2 A’|…|αn A 即可。如果一个非终结符号A是经多步推导而出现的左递归,则可对相关产生式作代入操作,将A-产生式化成直接左递归的,再按上面的方法将左递归消除。下面,再给出一种通过将文法G=(VN,VT,P,S)表示成矩阵形式而一次消除G的全部左递归的方法。 首先,令VN={X1,X2,…,Xn},且对G的每个产生式 Xi→γ1|γ2|…|γm (i=1,2,…,n) 可将其写成 Xi=X1α1i+X2α2i+…+Xnαni+βi (i=1,2,…,n) 其中:“=”和“+”分别代表原产生式中的“→”和“|”;若原产生式中不含以Xj开头的候选式,则相应的αji=φ;βi是原产生式中以终结符号开头的诸候选式之“和”。于是,文法G的诸产生式便可写成如下的矩阵方程 或 X=AB+B 此方程有形如X=BA*的最小解,由于A*=I+AA*,若令 A*=Z= 则有 X=BZ Z=I+AZ 其中 将上述两矩阵式写成分量式,便得到一组新的产生式,设它们所构成的文法为G’,则有L(G’)=L(G)。另外,由于向量B的各元素的每一项均是以终结符号打头的符号串,故矩阵式X=BZ相应的各产生式不含左递归的非终结符号;与矩阵式Z=I+AZ相应的各产生式显然也不是左递归的。也就是说,通过两述两矩阵式,我们已消除了原文法G的一切左递归。 2.消除回溯 对于给定的文法G[S]=(VN,VT,P,S)和给定的输入符号串w=a1a2…an(ai∈VT),为判断w是否为L(G)中的句子,现试图为w建立一个从S出发的最左推导,设经过若干步推导后,得到 A∈VN β∈(VN∪VT)* 其中w1=a1a2…ai-1,即w的一个前缀w1已从上面的推导得到匹配,现需对Aβ继续进行推导,以期使余下的输入串aiai+1…an也获得匹配。此时应使用A-产生式进行推导,现设G中的全部A-产生式为 A→γ1|γ2|…|γm 且对这m个候选式γk(1≤k≤m),要么全部γkβ均不能推出以ai打头的符号串(此时wL(G)),要么若存在一个γj,能使γjβ推导出以ai打头的符号串,而其余的γkβ (1≤k≤m,k≠j)则不能推出,这样,上述推导过程在产生式选择上的试探将可避免。如果文法G中的全部产生式均满足上述要求,则消除回溯的问题自然就解决了。 可见,要实现无回溯的自顶向下语法分析,对相应文法须有一定的要求。为导出文法应满足的条件,需定义候选式γ的终结首符集和非终结符号A的后继终结符号集如下: FIRST(γ)={a|γaδ,且a∈VT,δ∈V*} FOLLOW(A)={a|S#αΑαδ,且a∈VT∪{#};α,βδ∈V*} 于是,对于一个已化简的非左递归文法G,在进行自顶向下语法分析时,不出现回溯的必要充分条件是,对于G中的每个产生式A→γ1|γ2|…|γm,其各候选式均应满足: (1)不同的候选式不能推出以同一终结符号打头的符

文档评论(0)

sy78219 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档