1、第四章 语法分析 syntax analysis Part I 主要内容 PDA 语法分析概述 递归子程序法 常用终结符号集 LL(1)方法 LR分析 1、下推自动机( PDA) Push Down Automata M=(S, , , , K, x0, F) S: 状态集合 :输入字母表 :下推字母表 : S () S * K: 初态集合 x0: 下推栈中的初始符号 F: 终态集合 ( Si, a, xk) = (Sj, ) -转换:输入符号全部读完,但 PDA的状态仍然可以进行转换。 a0 a1 a2 a3 a4 a5 a6 a7 a8 an-1 an 有限控制器 磁头 识别程序的数学模型
2、下推自动机 例 S=S0 =(,) =A,( : S () S * K=S0 x0=A F=S0 ( S0,(,A)=( S0,(A ) ( S0,(,( )=(S0,() ( S0,),( )=(S0, ) ( S0, ,A)=(S0, ) 对于输入串: ( ( ) ( ) ) 如何进行识别? 例: Pda P=(A,B,C),a,b,c), h,i, f, A,i, ) f(A,a,i) = (B,h) f(B,a,h) = (B,hh) f(C,b,h) = (C, ) f(A,c,i) = (A, ) f(B,c,h) = (C,h) 接受输入串 aacbb的过程 (A,aacbb,i
3、) 读 a, pop i, push h, goto B (B,acbb,h) 读 a, pop h, push hh, goto B (B,cbb,hh) 读 c, pop h, push h , goto C (C,bb,hh) 读 b, pop h, push , goto C (C,b,h) 读 b ,pop h, push , goto C (C, , ) PDA与语法分析 PDA: NPDA, DPDA 2型文法 -程序设计语言 -PDA 终止和接受的条件 : 1.到达输入串结尾时,处在 F中的一个状态 (终态 ) 或 2.某个动作序列导致栈空时 2、语法分析概述 语法分析任务 语
4、法分析分类 2、语法分析概述 语法分析任务:根据语法规则逐一分析词法分析得到的属性字(单词序列),检查语法错误,若无错,则给出正确的语法结构;若有错,则报错。 2、语法分析概述 语法分析分类 自顶向下 top-down parsing 自底向上 bottom-up parsing 句型的分析算法分类 分析算法可分为: 自上而下分析法 : 从文法的开始符号出发 ,反复使用文法的产生式, 寻找 与 输入符号串 匹配 的 推导 。 自下而上分析法 : 从 输入符号串 开始 , 逐步进行 归约 ,直至归约 到 文法的 开始符号 。 自顶向下 GZ: Z-aBd B-d | c B-bB 给定符号串 a
5、bcd,如何 Z*=abcd? PDA模拟 设下推栈 #S, 状态控制器中状态只有一个,整个分析过程是在语法分析程序控制下进行的。 1、若 栈顶 X为 Vn,则查询语法分析表,找出一个以 X为左部的产生式(语法规则),将 X弹出 栈,而把 产生式右部的符号串以从右向左的次序进 栈。(推导) 2、 若 栈顶 X为 Vt,且读头所指向的输入符号也是 X, 则匹配。此时, X出栈,读头右移。 3、 ERROR: 若 栈顶 X为 Vt,且读头所指向的输入符号不是 X,则说明前面推导时选错了规则,应退到上次规则之前。(回溯) 4、重新选规则进行推导 5、若栈内只有栈底符号 #,而读头也指到了输入的最后符
6、号 #,则分析成功。 自顶向下的关键问题是每次该选择哪条规则。 自底向上 GS S-aAcBe A-Ab | b B-d abbcde 自底向上的栈式分析过程 从输入串依次读入输入符号,直到一个简单短语出现在分析栈的栈顶,然后将栈顶的简单短语归约成相应的 Vn,重复上述过程,直到栈中只剩下开始符号,而输入串全部被处理完。 自底向上主要问题是何时应该归约,以及选择哪条规则进行归约。 句型分析的有关问题 1)在自上而下的分析方法中 如何 选择 使用 哪个 产生式进行推导 ? 假定要被代换的最左非终结符号是 B,且有 n条规则: B A1|A2|An ,那么如何确定用哪个右部去替代 B? 2)在自下
7、而上的分析方法中 如何 识别可归约的串 ? 在分析程序工作的每一步,都是从当前串中 选择一个 子串 ,将它 归约 到 某个非终结符号 ,该子串称为“ 可归约串 ” 刻画“可归约串” 文法 GS 句型的短语 S =* A 且 A =+ , 则称 是 句型 相对于非终结符 A的 短语 句型的直接短语 若有 A , 则称 是句型 相对于非终结符 A 的 直接短语 句型的句柄 一个句型的 最左直接短语 称为 该句型 的 句柄 2、语法分析概述 错误处理 开始单词错 后继单词错 标识符和常量错 括号类配对错 分隔符错 错误的种类 3、递归子程序法 基本思想:对源程序的每个语法成分编制一个处理子程序,从处理这个语法成分的子程序开始,在分析过程中调用一系列过程或函数,对源程序进行语法语义分析,直到整个源程序处理完毕。 子程序 简单子程序 嵌套子程序 递归子程序 子程序执行机制是什么? 子程序执行机制分析:进入子程序时要保存现场;退出子程序时要恢复现场。 递归子程序语法分析方法 语法规则预处理: 消除左递归 提取公因子