编译原理第五篇 语法分析-自底向上分析方法.pptVIP

  • 15
  • 0
  • 约1.63万字
  • 约 69页
  • 2017-06-07 发布于湖北
  • 举报

编译原理第五篇 语法分析-自底向上分析方法.ppt

第五章 自底向上分析方法 主要内容 自底向上分析的基本思想 简单优先分析方法 LR类分析方法 例:S ? aAcBe [1] A ? b [2] A ? Ab [3] B ? d [4] 输入流:abbcde。 规范推导过程为: 简单优先分析 一种shift-reduce分析方法 根据文法符号的优先关系确定句柄 文法符号的优先关系的确定 文法优先关系的确定 FIRST(W) ={S | W ?+ S…,S?(VN?VT)} LAST(W) ={S | W ?+ …S,S?(VN ?VT)} 若有U?…SiSj…: 则有Si ? Sj ; 若有U?…SiW…:任Sj?FIRST(W),有Si ? Sj 若有U?…VW…:任Si?LAST(V), Sj?(FIRST(W) ?{W})则有Si ? Sj 输入流的开始和结束标志 ‘#’,文法的开始符为Z, S?FIRST(Z),有# ? S,; 且# ? Z S?LAST(Z),有S ? #,; 且Z ? # 优先关系矩阵 一个文法的全部优先关系可以用矩阵来表示,称作优先关系矩阵。 例: Z ? bMb M ? a M ? (L L ? Ma) 定理: 设X1…XiXi+1…Xj…Xn是一个句型,若有 Xi ?Xi+1 ?Xi+2 ?… ?Xj-1 ?Xj ?Xj+1 则Xi+1Xi+2…Xj-1Xj一定是该句型的简单短语。 结论: ?用来确定句柄的头; ?用来确定句柄的内部; ?用来确定句柄的结束。 简单优先分析算法要点 找第一个使Sj?Sj+1的Sj 从Sj开始往前(左)找第一个使Si-1?Si的Si 用SiSi+1…Sj去查产生式的右部,并用相应的左部符号代替句柄SiSi+1…Sj (归约) 。 重复上述过程,直至输入符结束。如果归约出文法的开始符号则成功。否则失败。 简单优先分析实例 活前缀的描述性定义:形成可归前缀之前,包括可归前缀在内所有规范句型的前缀都称为活前缀。 活前缀 为一个或若干规范句型的前缀。 在规范归约过程中的任何时刻已分析过的部分,即在分析栈(符号栈)中的符号串均为规范句型的活前缀,表明输入串的已被分析过的部分是该文法某规范句型的一个正确部分。 派生定理 开始符产生式的右部是归约活前缀。 如果?A?是归约活前缀,且A→?是产生式, 则??也是归约活前缀。 任何归约活前缀,都可按上述方式被派生。 设文法开始符的产生式是: S →?1|?2|…|?n RPSG={?1,…,?n}?{??|?A??RPSG,A→??P} 例有文法G[S]: S → aAc [1] A → Abb [2] A → b [3] LR(0)项目:若A→??是产生式, 则称A→???为LR(0)项目(简称项目),也 写作???[p]形式。 项目集的投影:假设IS是LR(0)项目集,则 称下面IS(X) 为IS关于X的投影集: IS(X) = {A→?X?? |A→??X??IS, X?(VT?VN)}. 项目集的闭包:假设IS是LR(0)项目集,则 称下面CLOSURE(IS)为IS的闭包集: CLOSURE(IS)= IS ? {A→?? | Y→??A??CLOSURE(IS) A→?是产生式 } 构造LR(0)活前缀状态机LRSM的算法要点 构造初始状态IS0:IS0=CLOSURE({Z→?S}),并给IS0标上NO。 从已构造的LRSM部分图选择被标为NO的任一状态IS,并做 [1] 对每个符号X?VT?VN,做下面动作: 1) 令ISj = CLOSURE( IS(X))。 2) 若在LRSM部分图中已有ISk与ISj有相同项目 集,则令m=k;否则构造ISj的状态点ISj, 并给ISj标上NO,同时令m=j。 3) 在IS和ISm之间画有向X边:IS ISm 。 [2] 给IS标上OK。 重复上一步骤,直至没有被标记为NO的状态结点为止。 例:构造LR(0)状态机 S ? E $ E ? E + T E ? T

文档评论(0)

1亿VIP精品文档

相关文档