错误抛出的阶段是什么时候?

时间:2015-02-16 13:16:03

标签: c compiler-construction compilation compiler-errors

编译通常分几个阶段进行:词法分析,语法分析等。用C语言说,我写了

a=24;

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

2 个答案:

答案 0 :(得分:3)

如果谈论一般形式的编译器,很明显,当解析器在符号表条目,中查找符号搜索时,错误将在语法分析阶段发生。后续阶段 - 仅在从错误中恢复后进一步处理

The dragon book 也清楚地说明了这一点。在页面中提到了提到错误类型的内容。在 4.1.3 - 语法错误处理 中给出了要彻底研究以理解此问题的主题。

a = 24;   // without declaring a as an int type variable.

在这里,词汇阶段的工作只是访问字符和形成标记,然后将它们传递给其他阶段,即语法分析阶段的解析等。

答案 1 :(得分:1)

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

如果我要编写编译器,我会让词法分析器吐出令牌(在这种情况下:a,=,24,最后;)。解析器将维护一个符号表,当看到符号a时,它将检查符号是否在表中;如果没有(如你的例子),它会发出错误信号。