C 在什么阶段抛出错误?

C 在什么阶段抛出错误?,c,compiler-construction,compilation,compiler-errors,C,Compiler Construction,Compilation,Compiler Errors,编译通常分为几个阶段:词法分析、语法分析等 a=24; 不将a声明为int。现在,在编译的哪个阶段检测到错误?在语法分析阶段?如果是这样,那么词法分析器做什么呢?仅标记源代码?如果谈论编译器的一般形式,很明显,当解析器在符号表条目中查找符号搜索时,错误将发生在语法分析阶段,以及后续阶段-只有在从错误中恢复后进一步处理时才会发生 也清楚地说明了这一点。在提到错误类型的页面中提到了它。4.1.3-语法错误处理中给出了要深入研究以理解此问题的主题 a = 24; // without decla

编译通常分为几个阶段:词法分析、语法分析等

a=24;

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

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

也清楚地说明了这一点。在提到错误类型的页面中提到了它。4.1.3-语法错误处理中给出了要深入研究以理解此问题的主题

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

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

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


如果我要编写编译器,我会让词法分析器吐出标记(在本例中:a、=、24和finally;)。解析器将维护一个符号表,当看到符号a时,它将检查符号是否在表中;如果没有(如您的示例中所示),则表示出现错误。

取决于语言,我建议您将问题的范围缩小到C。我想说的是语法分析。您所讨论的阶段可能是一幅简化图。词法分析器只在源代码中找到标记,并将它们交给语法分析器,语法分析器会用语言语法检查,这对你有帮助。或者试着读一读《龙书》,谢谢你的回答。所以,如果我写“inta=24”,词法分析器会将其标记为“int”、“a”、“=”、“24”。每当它看到int时,就会将下一个标记(在本例中是-a)添加到符号表中。当下一次“a”出现时,语法分析器会在符号表中看到它,一切正常。我说得对吗?@anil-是的,为避免重复,插入前会在符号表中检查所有条目。因此,我们通常使用哈希表作为实现符号表的有效数据结构,以便查找复杂度为O(k)或O(1),无论您认为两者之间的最佳值是多少。我认为这并不明显。我想说,一般来说,错误会发生在语义分析中,而不是句法分析中——因为
a=24
是一个完全有效的语句(简化语法:
decl\u expr:=lvalue'='rvalue';'
)。只有在语义分析中,它才能发现
a
没有被声明。然而,当特别谈论C时,行通常有点模糊,你可以说它发生在其中一个(或者可能两者都发生)。@TimČas-不,先生,将首先在符号表中搜索a,以便如果条目存在,那么它将不会被插入。如果没有,那么在词法分析阶段应该在符号表中插入一个,从而导致错误。我引用了《龙之书》中的一句话,先生-@TimČas-
,解析方法的精确性允许非常有效地检测语法错误。几种解析方法,如LL和LR方法,可以检测4。1.引言195尽快纠正错误;也就是说,当来自词法分析器的标记流无法根据语言的语法进一步解析时。更准确地说,它们具有可行的prefix属性,这意味着它们在看到输入的前缀时会立即检测到错误,而该前缀无法在语言中形成字符串