在什么阶段抛出错误?

At what stage is error thrown?

编译一般发生在几个stages:lexical分析,语法分析等。说,C语言,我写

a=24;

而不将 a 声明为 int。现在,在编译的哪个阶段检测到错误?在语法分析阶段?如果是这样的话,那么词法分析器是做什么的呢?只是标记源代码?

如果谈论一般形式的编译器,很明显当解析器在符号 table 条目中查找符号搜索时,错误将发生在语法分析阶段 , 和后续阶段 - 只有在从错误 .

恢复后进一步处理

The dragon book 也说得很清楚了。在提到错误类型的页面中提到了它。 4.1.3 - 语法错误处理 .

中给出了要深入研究以理解此问题的主题
a = 24;   // without declaring a as an int type variable.

这里词法阶段的工作只是简单地访问字符和形成标记,然后将它们传递给进一步的阶段,即语法分析阶段的解析等

我不知道你的编译器,但一般来说,这会在解析阶段(语法分析)而不是词法阶段(标记化)。大多数 C 编译器将使用 lex/yacc 变体编写,这使得上述假设更加合理。如果您想了解详细信息,请深入研究 the dragon book,这是一个很好的资源。

如果我要编写编译器,我会让词法分析器吐出标记(在本例中:a、=、24,最后是 ;)。解析器将维护一个符号 table 并且在看到符号 a 时它会检查该符号是否在 table 中;如果不是(如您的示例所示),则会发出错误信号。