4第四章 自顶向下语法分析法3.pdfVIP

  • 6
  • 0
  • 约6.7千字
  • 约 20页
  • 2018-10-19 发布于山东
  • 举报
主要内容 自顶向下分析概述 递归下降分析算法 First 集合和Follow集合 LL(1)分析 TINY语言的递归下降分析程序 自顶向下分析程序中的错误校正 • TINY语言的递归下降分析程序 自学并运行相关程序 主要内容 自顶向下分析概述 递归下降分析算法 First 集合和Follow集合 LL(1)分析 TINY语言的递归下降分析程序 自顶向下分析程序中的错误校正 • 自顶向下分析程序中的错误校正 分析程序对于语法错误的反应通常是编译器使用 中的主要问题。在最低限度之下,分析程序应能 判断出一个程序在语句构成上是否正确。 分析程序(识别程序recognizer)的工作:若程 序包括了一个语法错误,则分析必须指出某个错 误的存在;反之若程序中没有语法错误,则分析 程序不应声称有错误存在。 出错的要求: (1)尽可能快地判断出错误的发生。 (2 )从出错的地方恢复分析,以便找到尽可能多 的真实错误。 (3 )避免出现错误级联问题(error cascade problem),即不会产生一个冗长的虚假的出错 信息。 (4 )避免错误的无限循环 递归下降分析程序中的错误校正的标准形式叫做 应急方式(panic mode)。错误处理器尽可能地 试图在大量的记号中找到一个恢复分析的位置。 应急方式还具有一个优点:它能真正保证在错误 校正时,分析程序不会掉到无穷循环之中。 应急方式的基本机制是为每个递归过程提供一个 额外的由同步记号(synchronizing token )组 成的参数。在分析处理时,作为同步记号的记号 在每个调用发生时被添加到这个集合之中。若遇 到错误,分析程序就向前扫描(scan ahead ), 并一直丢弃记号直到看到输入中记号的一个同步 集合为止,并从这里恢复分析。在做这种快速扫 描时,通过不生成新的出错信息来(在某种程度 上)避免错误级联。 在进行该错误校正时需要作出一个重要的判断:在分析的 每步中需添加哪些记号。 一般地,Follow集合是这样的同步记号中的重要一员。 Follow集合也可用来使错误处理器避免跳过开始新的主要 结构的重要记号 (如语句或表达式)。 First集合也很重要,这是因为它们允许递归下降分析程 能在分析的早些时候检测出错误,它对于任何错误校正总 是有用的。 • 总结 设非终结符A 的产生式为:AE 则它相应的递归子程序为: void A () { E (); } 设语法分析程序调用过程A ,并且当进入过程A 时当前符 号token不是A 的开始符,这时出现语法差错。 为了继续进行语法检查,应向前继续读符号,直到遇到A 的开始符为止。 然后,执行E继续进行检查。 但是,如果用户程序中在此处缺少A 的开始符,那么向前 读符号将会漏检太多的符号。 因此,在向前读符号时,遇到A 的后继符或正在活动的那 些过程 (目前调用A过程的过程以及各个直接外层相应的 过程)相应的非终结符的后继符时也应停止读入。 在这种情形下,应放弃当前语法单位的检查,即不作任何 动作就退出过程A ,进而退出那些正在活动的过程而从该 后继符 (它是下一语法单位的开始符)起进行下一语法单 位的检查。 这就是说,在进入过程A 时,应该先调用检测头符号的过 程。 void checkinput ( firstset, followset ) ; { if not ( token in firstset ) { error( ) ; scanto ( firstset ∪followset ) ; } } firstset是头符号集合,followset是正在活动的那些过程 相应的非终结符的后继符集合。scanto是表示向前读符 号,直到所读符号属于集合firstset ∪followset为止。 void scanto ( synchset ) ; { while not ( token in synchset ∪{ $ }) getToken( ) ; } 注意:这里的$指的是输入的结尾(EOF)。 从前面的讨论看到,当向前跳到的符号属于A 的后继符集 或正在活动的那些过程相应的非终结符的后继符

文档评论(0)

1亿VIP精品文档

相关文档