语法分析-自上而下分析.pptVIP

  • 17
  • 0
  • 约4.17千字
  • 约 48页
  • 2017-04-21 发布于湖北
  • 举报
语法分析-自上而下分析; ;4.1 语法分析器的功能;词法分析器; 语法分析器的功能:按照文法的产生式,识别输入符号串是否为一个句子。这里所说的输入串是指由单词符号(文法的终结符)组成的有限序列。 关键:对一个文法,当给你一串(终结)符号时,怎样知道它是不是该文法的一个句子呢?这就要判断,看是否能从文法的开始符号出发推导出这个字符串。或者,从概念上讲,就是要建立一棵与输入串相匹配的语法分析树。 ;语法分析的方法: 自上而下分析法 基本思想:从输入串开始,逐步进行“归约”,直至归约到文法的开始符号;或者说,从语法树的末端开始,步步向上“归约”,直到根结。所谓归约,是指根据文法的产生式规则,把产生式的右部替换成左部符号。 自下而上分析法 基本思想:从文法的开始符号出发,根据文法的产生式规则正向推导出给定句子的一种方法;或者说,从树根开始,往下构造语法树,直到建立每个叶的分析方法。;4.2 自上而下分析面临的问题;这种分析过程本质上是一种试探过程,是反复使用不同产生式谋求匹配输入串的过程。 例4-1 假定有文法: (1) S→xAy (2) A→**|* 分析输入串x*y(记为?)。 ; 实现这种自上而下的带回溯试探法的一个简单途径是让每个非终结符对应一个递归子程序。每个这种子程序可作为一个布尔过程。一旦发现它的某个候选与输入串相匹配,就用这个候选去扩展语法树,并返回“真”值;否则,保持原来的语法树和IP值不变,并返回“假”值。;面临的问题:;其次,由于回溯就碰到一大堆麻烦事情。如果我们走了一大段错路,最后必须回头,那么,就应把已经做的一大堆语义工作推倒重来。 第三,在上述的自上而下分析过程中,当一个非终结符用某一个候选匹配成功时,这种成功可能仅是暂时的。 第四,当最终报告分析不成功时,我们难于知道输入串中出错的确切位置。 最后,由于带回溯的自上而下分析实际上采用了一种穷尽一切可能的试探法,因此效率很低,代价极高。;一、左递归的消除;一般地,若 αi≠ε,βj不以P开头, 则可改写为: 从而消除直接左递归??? 例:S→Sabc|Sab|ab 消除直接左递归得: ;2、完全消除左递归 分析 虽不含直接左递归,但 所以含有左递归。 如果文法G不含回路( ),也不含ε产生式,则下列算法可消除左递归(完全);例:上述文法 ①排序:S,Q,R ②循环: i=1时,处理S→Qc|c,消除直接左递归,不变 i=2时,处理Q→Rb|b,j=1,把有关Q的产生式中以S开头的候选式替换(无),所以不变 i=3时,处理R→Sa|a, j=1,把以S开头的候选式替换, 得R→Qca|ca|a ; j=2,把以Q开头的候选式替换, 得:R→Rbca|bca|ab|b 消除R的直接左递归,得: R→bcaR’|abR’|bR’ R’→bcaR’|ε ③整理: 得:S→Qc|c Q→Rb|b R→bcaR’|abR’|bR’ R’→bcaR’|ε;二、提取左因子、消除回溯 1、FIRST(?) 设文法G是不含左递归的文法,对其任何非终结 的候选式?定义: FIRST(?)={a|? a?,a∈VT, ?, ?∈V*} 若? ε,则规定ε∈FRIST(?) ;2.应用 如果一个文法G的非终结符A的多个候选式之首符集两两不相交,那么在自上而下分析时便可消除回溯。 设 ,而FIRST(α1),…,FIRST(αn)两两不相交,那么当分析时要A去匹配某输入串时,便可根据此输入串的输入符号a,准确地选用候选式αi (设a∈FIRST(αi),若ε∈FIRST(αi)以后讨论) 。;例:文法S→aSb|c, 输入串为aacbb时: 3.公共左因子的提取: 把文法改造为每个非终结符的所有候选式两两不相交的方法是提取公共左因子。 可改造为:;三、LL(1)分析法;1、LL(1)分析法的工作过程 开始往栈stack中放“#”,然后把文件开始符号压栈。预测分析程序总是按stack栈顶符号X和当前输入符号a行事。 ① 若X=a=”#”,则分析成功,停止分析 ② 若X=a”#”,则把X从栈顶弹出,a指向下一个 输入符号 ③ 若X∈Vn,则查分析表。 若M[X, a]为某候选式,则弹出X,把该候选式反序压栈;若M[X, a]=ε,则弹出X,什么也不压;若M[X, a]=error,

文档评论(0)

1亿VIP精品文档

相关文档