整数 x;是语法错误还是语义错误?

问题描述

这是一个 ANSI C 程序。七阶段C编译器哪个部分会报错?
社区分为语法分析器和语义分析器。

int main()
{
    Integer x;
    return 0;
}

声明:这个问题是在 2021 年的 GATE 考试中提出的。它不是任何现场考试的一部分。

解决方法

C 标准定义了 8 个翻译阶段,而不是 7 个。1 由于第 8 阶段执行传统上由链接器执行的操作(解析外部引用和创建程序映像),人们可能会考虑使用编译器由阶段 1 到 7 组成。

标准没有给阶段命名,例如“语法分析器”和“语义分析器”。检测 Integer x; 中的错误的唯一阶段是第 7 阶段,在该阶段“对生成的标记进行语法和语义分析并作为翻译单元进行翻译。”这可以看出,因为显示的源文本,包括 Integer x;,可以通过阶段 1 到 6 成功处理:文本显然会在预处理结束时继续存在,即阶段 4,然后阶段 5 和 6简单地将字符转换为执行字符集并连接相邻的字符串文字,这对于此源文本也没有问题。

脚注

1 C 2018 5.1.1.2,与 C 1990 之前的早期版本相同。