第四章(上)重要概念回顾.pptVIP

  • 60
  • 0
  • 约2.39万字
  • 约 84页
  • 2017-01-03 发布于重庆
  • 举报
第四章:语法分析 第四章(上)重要概念回顾 如果S?* αAβ and A?+γ,则称γ是句型αγβ的相对于变量A的短语 如果S?* αAβ and A?γ,则称γ是句型αγβ的相对于变量A的直接(简单)短语 最左直接短语叫做句柄 规范归约(另一表达):设α为文法 G 的句子,如果 1) α=αn?αn-1?…?α2?α1=S 2)对每个i(1≤i≤n),αi-1是将句型αi中的句柄归约后得到的句型,则称序列 αn,...,α1为α的规范归约序列—由规范归约组成 4.6 自底向上语法分析概述 基本思想:从待输入的符号串开始,利用文法的规则步步向上归约,试图归约到文法的识别符号。从语法树的角度看,自底向上分析的过程是以输入符号串作为末端结点符号串,向着根结点的方向往上构造语法树,使识别符号正好是该语法树的根结点。如果最终根结点是识别符号,则输入串被识别出是相应语言的句子,否则不是。自底向上分析过程实际上是一个不断进行直接归约的过程。 遇到的问题:采用自底向上分析技术进行语法分析时,在分析的每一步中,会遇到的两个基本问题是: ①如何找出进行直接归约的简单短语? 4.6 自底向上语法分析概述 遇到的问题: ②找出的简单短语应直接归约到哪一个非终结符号?(即在S ?* αAδ且A ?β推导出的αβδ中如何找到β使αβδ归约为αAδ,最终归约为S。) 解决方法: 由于分析过程是从左往右扫描源程序,所以遇到的第一个简单 短语正好是句柄,第一个问题变成“如何找到句柄”。 如何找到句柄?找出的句柄应归约到哪一个非终结符号?对这 两个,不同的分析算法有不同的解决方法。 4.6 自底向上语法分析概述 基本实现方法: 自底向上分析的基本实现方法是移入-归约 法。采用移入-归约法时通常引进一个后进先出的栈来存放符号,按 照扫描顺序把当前输入符号下推入栈(移入),然后查看栈顶的符 号串是否形成句柄。如前所述,引进了符号#作为输入符号串的开始 和结束符,所以它也作为符号栈的第一个符号,即栈底标志符号。 在整个分析过程中,动作共有4类,即移入、归约、接受与报错: 移入:读入下一个输入符号并把它下推进栈。 归约:当栈顶的(部分)符号串形成一个句柄时,对此句柄 进行归约,把形成句柄的符号串替换为相应的非终结符号。 4.6 自底向上语法分析概述 基本实现方法: 接受:当识别程序发现栈顶除了栈底标志符号#外仅有识别符 号,而输入也已到达右端标志符号#,因而识别出输入符号串是一 个句子时,执行接受动作而结束识别工作。 报错:当识别程序察觉一个错误,因此输入符号串不是句子而 无法继续识别工作时,调用一个出错处理子程序进行处理或停止。 主要分析方法:简单优先分析算法、算符优先分析算法以及适于自动生成的LR(k)分析算法。 4.6 自底向上语法分析概述 系统框架 输入缓冲区:保存输入符号串 控制程序:控制分析过程,输出分析结果——产生式序列 栈:保存语法符号—已经得到的部分结果 系统运行: 开始状态:栈:#;输入缓冲区:ω# 存放已经分析出来的结果,并将读入的符号送入栈,一旦句柄在栈顶形成,就将其弹出进行归约,并将结果压入栈 正常结束: 栈中为 #S,输入缓冲区只有 # 4.6 自底向上语法分析概述 4.6 自底向上语法分析概述 一个简单的归约过程: 设文法为: S→aAcBe A→Ab|b B→d 句子abbcde的分析: abbcde ?aAbcde ? aAcde ?aAcBe ? S 4.6 自底向上语法分析概述 a b b c d e 4.6 自底向上语法分析概述 4.6 自底向上语法分析概述 上面的归约过程是从文法的句子abbcde开始,每一步都是把最左直接短语(句柄)替换为相应产生式的左部符号(在步骤5时栈顶为#aAb,此时是将b归约为A还是将Ab归约为A?由于此时对于句型aAbcde(即栈内容+输入缓冲区内容)来说Ab是句柄,故将Ab归约为A)。也就是说,自底向上分析的关键问题是在分析中如何确定句柄(准确地说为可归约串),即如果知道何时在栈顶符号串中已形成了某句型的句柄,那么就可以确定何时进行归约。对此,不同的分析方法有不同的解决办法。这里主要介绍算符优先及LR分析方法。 4.7 算符优先分析方法 算符优先的引入:算符优先分析法在寻找句柄(即可归约串)的过程中只考虑算符(广义上为终结符)之间的优先关系(而不考虑非终结符号,若考虑就为简单优先文法,但其很少用)。 如有简单表达式文法如下G[E] : E→E+E|E-E|E*E|E/E|E↑E|(E)|-E|id 对输入串id1+id2*id3的归约过程可表示为:

文档评论(0)

1亿VIP精品文档

相关文档