编译原理课件Chapt4-.pptVIP

  • 0
  • 0
  • 约1.24万字
  • 约 86页
  • 2017-02-02 发布于湖北
  • 举报
编译原理 第四章 语法分析—自上而下分析 本章主要内容 本章主要介绍语法分析的处理 语法分析的任务 自顶向下分析法 4.3.2 消除回溯、提左因子 为了消除回溯就必须保证:对文法的任何非终结符,当要它去匹配输入串时,能够根据它所面临的输入符号准确地指派它的一个候选去执行任务,并且此候选的工作结果应是确信无疑的。 A→? 1 | ? 2 | … | ? n 令G是一个不含左递归的文法,对G的所有非终结符的每个候选?定义它的终结首符集FIRST(?)为: 如何将一个文法改造成任何非终结符的所有候选首符集两两不相交呢? 提取公共左因子: 假定关于A的规则是 A→?? 1 | ?? 2 | …| ?? n | ? 1 | ? 2 | … | ?m (其中,每个? 不以?开头) 那么,可以把这些规则改写成 A→?A? | ? 1 | ? 2 | … | ? m A?→? 1 | ? 2 | … | ? n 经过反复提取左因子,就能够把每个非终结符(包括新引进者)的所有候选首符集变成为两两不相交。 当一个文法不含左递归,并且满足每个非终结符的所有候选首符集两两不相交,是不是就一定能进行有效的自上而下的分析了呢? 例如: E→TE? E?→+TE? | ? T→FT? T?→*FT? | ? F→(E) | i i + i 2、FOLLOW集 假定S是文法G的开始符号,对于G的任何非终结符A,我们定义 对于一个满足上述条件的文法,可以对其输入串进行有效的无回溯的自上而下分析。 假设要用非终结符A进行匹配,面临的输入符号为a,A的所有产生式为 A→? 1 | ? 2 | … | ? n 1. 若a?FIRST(? i),则指派? i执行匹配任务; 2. 若a不属于任何一个候选首符集,则: (1) 若?属于某个FIRST(?i )且 a?FOLLOW(A), 则让A与?自动匹配。 (2) 否则,a的出现是一种语法错误。 回顾:LL(1)分析法 构造不带回溯的自上而下分析算法 要消除文法的左递归性 克服回溯 4.4 递归下降分析程序构造 构造不带回溯的自上而下分析程序 要消除文法的左递归性 克服回溯 分析程序由一组递归过程组成,文法中每个非终结符对应一个过程;所以这样的分析程序称为递归下降分析器。(因为文法的定义通常是递归的) 几个全局过程和变量: ADVANCE,把输入串指示器IP指向下一个输入符号,即读入一个单字符号 SYM,IP当前所指的输入符号 ERROR,出错处理子程序 例:文法G(E): E→TE? E?→+TE? | ? T→FT? T?→*FT? | ? F→(E) | i 每个非终结符有对应的子程序的定义,首先在分析过程中,当需要从某个非终结符出发进行展开(推导)时,就调用这个非终结符对应的子程序。 例:文法G(E): E→TE? E?→+TE? | ? T→FT? T?→*FT? | ? F→(E) | i 对应的递归下降子程序为: PROCEDURE F; IF SYM=‘i’ THEN ADVANCE ELSE IF SYM=‘(’ THEN BEGIN ADVANCE; E; IF SYM=‘)’ THEN ADVANCE ELSE ERROR END ELSE ERROR; 文法的另一种表示法和转换图 在元符号“→”和“|”的基础上,扩充几个元语言符号: 1. 用花括号{?}表示闭包运算?*。 2. 用表示{?}0n可任意重复0次至n次,。 3. 用方括号[?]表示{?}01 ,即表示?的出现可有可无(等价于?|?)。 引入上述元符号的文法亦称扩充的巴科斯范式。 例如,通常的“实数”可定义为: decimal→[sign]integer.{digit}[exponent] exponent→E[sign]integer integer→digit{digit} sign→ + | - 用扩充的巴科斯范式来描述语法,直观易懂,便于表示左递归消去和因子提取。 例4.5 文法 E→T | E+T T→F | T*F F→i | (E) 可表示成 E→T{+T} T→F{*F} F→i | (E) (4.6) E→T{+T} T→F{*F} F→i | (E)

文档评论(0)

1亿VIP精品文档

相关文档