编译原理课件(hdu)CHAPTER 8(Error Detection and Reporting).pptVIP

  • 2
  • 0
  • 约 16页
  • 2017-08-31 发布于安徽
  • 举报

编译原理课件(hdu)CHAPTER 8(Error Detection and Reporting).ppt

Chapter8 Error Detection and Reporting §8.1 概述 * 1、程序在语法(词法)上正确 — 可以得到与源程序等价的目标代码 错误的种类: 语法错误:语法分析阶段发现的源程序错误(语法结构不符合语法规则) 语义错误: 一个好的编译器应具有较强的查错和改错的能力 株连信息的遏止:株连信息是因为某个错误而导致编译程序向用户(程序书写者)发出的虚假错误信息 改错(校正):是指编译程序在其翻译过程中发现源程序的错误时能适当地对源程序作修正 §8.2 词法错误处理 词法错误主要是拼写错误,如拼错一个字符、遗漏一个字符、多拼一个字符等 词法错误的校正: §8.3 语法错误处理 程序设计语言的语法用上下文无关文法描述,源程序可由基于某种分析技术的识别程序来精确地识别,源程序中的语法错误总可以自动地查出 语法错误的校正: LR分析的出错处理: 例:i := i + ) ; 扫描到 + 时进入状态 Sk , ACTION ( Sk , ) ) 为出错(空白),这时调用错误处理子程序,删除当前字符,给出出错信息,“不合法的输入符号:)”,继续扫描,ACTION(Sk , ;),出错,调用另一错误处理子程序,将一假想的标识符号 i 及相应状态 Sl 推入栈中,并给出出错信息,“缺少运算分量”,语句最终被校正为 i := i + i ; §8.4 语义错误处理 主要考虑在编译时发现的静态语义错误 语义错误检查: 语义分析采用的是语法制导翻译 通过语法制导定义和翻译方案可以实现类型一致性检查和某些控制流静态语义检查(见语义分析部分的相关内容) * * 概 述 词 法 错 误 处 理 语 法 错 误 处 理 语 义 错 误 处 理 2、程序在语义上正确 — 运行目标代码可以得到预期的输出结果 3、程序中错误的存在是必然的,没有一个程序第一次运行就能正确地工作 词法错误:源程序中的拼写错误,主要在词法分析阶段发现(单词符号不符合词法规则) 关键字拼写错 分界符错 标识符错 BEGIN 与 END 不匹配 (和)不匹配 IF 与 ELSE 之间缺少 THEN 等 变量未说明或重定义 静态语义错误:编译时刻发现的语义错误,如类型不一致或不相容 动态语义错误:运行时刻发现的语义错误(逻辑或算法上的错误) 查错:编译程序能在编译时刻准确及时地发现源程序中的错误,并能以简明的方式向用户(程序书写者)报告错误的性质和出现的确切位置 不能一发现问题就停下来,而应在一次编译中发现尽可能多的错误 重复信息的遏止:重复信息是指同一个错误在源程序的多处发生 如:一个未定义的标识符号,在每次引用时都报错,其实只需报错一次即可 如:将 P ( a , b ) 写为了 P ( a . b ),则有可能报错,1、. 是不合法符号(假设删除.);2、标识符未定义(a b);3、参数个数少 单词符号用正规式表示,用有限自动机识别,在识别单词时,通常采用最长子串匹配策略,如果当前的余留输入字符序列的任何前缀不能与所有的词型相匹配,则表明存在错误 一般不能在词法分析阶段校正,可在以后的分析阶段进行校正 如:IF b THEM… 知道在 b 后应接关键字,因此到关键字表中去寻找一个最接近 THEM 的关键字(THEN)代替 THEM 又如:x := sim ( a ) 在符号表中找不到 sim ,于是用 sin 代替 sim 不同的分析技术发现错误的手段和方式是不同的 LL(1)、LR分析技术都是当栈顶状态与当前输入符号配对所对应的分析表元素为空白时发现错误 算符优先分析,是当前栈顶符号和当前输入符号之间不存在优先关系时发现错误 在语法分析部分已经介绍了预测分析法和算符优先分析法的出错处理(P194 P210) 发现错误,根据错误类别,调用错误处理子程序 错误实例: 数组变量进行加法运算 实型变量进行 MOD 运算 实型变量与字符型变量进行加法运算 由循环外控制转移到循环内 除了类型不一致或不相容,其他语义错误的校正是非常困难的

文档评论(0)

1亿VIP精品文档

相关文档