编译器设计中的错误处理是什么?
源程序中错误的检测和报告是编译器的主要功能。编译的任何阶段都可能发生错误。一个好的编译器必须准确地确定程序的行号,即发生错误的地方。在不同编译级别可能发生的各种错误如下-
第一个是词法(扫描仪)错误-这里一些最常见的类型包括非法或无法识别的字符,主要是由输入错误引起的。发生这种情况的一种常见方式是程序员键入在该语言的任何实例中都是非法的并且从未使用过的字符。扫描器可以检测到的另一种错误是未终止的字符或字符串常量。每当程序员在引号中键入某些内容而忘记尾随引号时,就会发生这种情况。
第二类错误是语法错误-这些错误被解析器捕获。这些错误是最常见的。困难的部分是在发现错误后决定从哪里继续语法分析。如果解析器编写不仔细,或者错误检测和恢复方案不正确,解析器将遇到一个错误并在此之后“搞砸”,并在程序的其余部分给出错误的错误消息。
如果出现错误,人们希望看到发生的事情是让编译器跳过任何不正确的标记,并继续检测错误而不生成错误消息,这些错误消息不是错误而是第一个错误的结果。这方面非常重要,以至于一些编译器根据其错误检测系统的好坏程度进行分类。
第三种错误是语义-计算机语言中使用的语义比口语中使用的语义简单得多。之所以如此,是因为在计算机语言中,一切都是非常明确的。程序中可能出现的语义错误与某些语句从语法的角度来看是正确的有关,但它们没有任何意义,并且无法生成代码来执行语句的含义。
代码优化过程中可能遇到的第四种错误-在控制流分析过程中,可能存在一些永远无法到达的语句。
代码生成期间可能发生的第五类错误-在代码生成中,计算机的体系结构也起着重要作用。
当编译器尝试创建符号表条目时,可能会遇到第六种类型的错误-在这种情况下,可能存在具有多个属性相互矛盾的声明的标识符。