第4章节自顶向下分析法.ppt

  1. 1、本文档共57页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4章节自顶向下分析法

集合FIRST 、FOLLOW构造 1. 设X∈( VN∪ VT),FIRST(X) 的构造 若X∈ VT ,则FIRST(X)={X} 若X∈ VN , 若其对应规则为X→a……,a∈ VT ,则a∈FIRST(X);若 X→ε,则ε∈FIRST(X); 若X →Y…,Y∈ VN ,则FIRST(Y)-{ε} ? FIRST(X);若X →Y1Y2…Yk,(其中Y1,Y2,…,Yi-1都是VN ,且Y1Y2…Yi-1 =*ε),则FIRST(Yi)-{ε} ? FIRST(X); 若Y1Y2…Yk =*ε,则ε∈FIRST(X); 集合FIRST 、FOLLOW构造 2. 设α∈( VN∪ VT)*,α = X1X2…Xn ,FIRST(α) 的构造 若α∈ε,则FIRST(α)={ε} 若α≠ε,则FIRST(X1)-{ε} ? FIRST(α); 若X1X2…Xi-1 =*ε,则 FIRST(Xi)-{ε} ? FIRST(α);若X1X2…Xn =*ε,则ε∈FIRST(α); 3.设U ∈ VN ,FOLLOW(U)的构造: 若U是文法开始符号,则$ ∈ FOLLOW(U); 若有规则A→αUβ,则FIRST(β)-{ε} ? FOLLOW(U); 若有A→αU,或A→αUβ,β =*ε,则FOLLOW(A)? FOLLOW(U); 求FIRST与FOLLOW集合练习 1.设文法G[S] S→A A→BA’ A’→iBA’| ε B→CB’ B’→+CB’| ε C→)A*|( 求所有非终结符号的FIRST和FOLLOW集合。 对于一个满足LL(1)条件的文法,可以对其输入串进行有效的无回溯的自上而下分析。假设要用非终结符A进行匹配,面临的输入符号为a,A的所有产生式为: A→? 1 | ? 2 | … | ? n 1. 若a?FIRST(? i),则指派? i执行匹配任务; 2. 若a不属于任何一个候选首符号集,则: (1) 若?属于某个FIRST(?i )且 a?FOLLOW(A), 则让A与?自动匹配。 (2) 否则,无法识别字符a,出现语法错误。 4.2.4 非LL(1) 到LL(1) 的等价变换 1. 非LL(1)文法 含有左公共因子的文法 若文法中含有形如:A→αβ|αr 的产生式。 含有左递归的文法。 2. 对非LL(1) 进行等价变换 提取左公共因子 消除左递归 注意:变换后的文法不一定是LL(1)文法,文法不含左递归和左公共因子只是LL(1)文法的必要条件。 (1)提取左公共因子 将产生式A→αβ|αr 等价变换为: A→α(β|r), 将括号内用一新引入的非终结符A’表示,得 A→αA’,A’→β|r 一般形式:若A→αβ1|αβ2|…|αβn, 提取左公共因子后变为A→αA’, A’→ β1|β2|…|βn 若在βi中仍含有左公共因子,可再次提取. 例 文法G1: S→aSb|aS|ε 提左因子得:S→aS(b|ε)|ε 引进新的非终结符得: S→aSS’|ε S’ →b|ε 4.2.5 确定的自顶向下分析方法 确定的自顶向下分析方法有: 递归下降分析法(递归子程序法) 预测分析法 两种方法都要求文法是LL(1)文法。 一.递归下降分析法 基本思想:对文法中的每个非终结符编写一个函数(或子程序),用来识别由该非终结符所表示的语法成分。当非终结符有多条产生式时,按当前输入符属于哪条产生式的SELECT集就可唯一确定选择哪个产生式进行匹配。 由于描述语言的文法常常是递归定义的,因此相应的函数或子程序必然以相互递归的方式进行调用,故此分析法称为递归下降分析法。 4.2.5 确定的自顶向下分析方法(续) 构造文法G的递归下降分析程序算法 每个函数名对应相应的非终结符。 函数体根据规则右部符号串结构编写 当遇到终结符a时,则编写语句 if(当前读来的输入符号==a)读下一输入符号 当遇到非终结符A时,则编写语句调用A() 当遇到A→ε时,则编写语句 if(当前读入的输入符号不属于Follow(A) ) error() 当某非终结符规则有多候选式时,按LL(1)文法条件能惟一选择一候选式进行推导。 特点 优点:简单直观、易于构造 缺点:对文法要求高,必须满足LL(1)文法;递归调用多,速度慢,占用空间多 几个全局过程和变量 Scanner():读取输入串指针IP指向的一个输入符号。 sym:IP当前所指的输入符号。 error():出错处理子程序。 例1 设有文法G[S]? S→a│∧|(T) T→T,S|S 构造识别该文法句子的

文档评论(0)

ctuorn0371 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档