【问题标题】:At what stage is error thrown?在什么阶段抛出错误?
【发布时间】:2015-02-16 13:16:02
【问题描述】:

编译一般发生在几个阶段:词法分析、语法分析等。话说,我用C语言写的

a=24;

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

【问题讨论】:

  • 取决于语言,我建议你只在 C 上缩小你的问题。
  • 我会说是语法分析
  • 你所说的阶段可能是一张简化图。
  • 词法分析器仅在源代码中找到标记并将它们提供给语法分析器,女巫用语言语法检查它,mb这将帮助您epaperpress.com/lexandyacc/download/LexAndYaccTutorial.pdf。或者试试看《龙书》

标签: c compiler-construction compilation compiler-errors


【解决方案1】:

如果说编译器的一般形式,很明显解析器在符号表项中查找符号时会在语法分析阶段出现错误和后续阶段 - 仅在从错误中恢复后进一步处理

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

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

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

【讨论】:

  • 感谢您的回答。所以,如果我写“int a = 24”,词法分析器会将其标记为“int”,“a”,“=”,“24”。每当它看到 int ,它将下一个标记(在这种情况下为-a)添加到符号表中。当下次“a”出现时,语法分析器在符号表中看到它并且一切正常。我说得对吗?
  • @anil- 是的,所有条目在插入之前都会在符号表中检查以避免重复。因此,我们通常使用 HashTable 作为实现符号表的高效数据结构,这样查找复杂度为 O(k) 或 O(1),无论您认为两者之间最好。
  • 我认为这并不明显。我想说,一般来说,错误会发生在 semantic 分析中,而不是 syntactic --- 因为a = 24; 是一个完全有效的语句(简化语法:@ 987654324@)。只有在语义分析中才发现a 没有被声明。然而,当特别地谈论 C 时,界限通常有些模糊,您可能会争辩说它发生在任何一个(或两者)中。
  • @TimČas- No SIR,a 将首先在符号表中搜索,以便如果条目存在则不会插入。如果不是,那么在词法分析阶段应该已经在符号表中插入了a,从而导致错误。我引用了龙书先生的一句话-
  • @TimČas-he precision of parsing methods allows syntactic errors to be detected very efficiently. Several parsing methods, such as the LL and LR methods, detect4. 1. INTRODUCTION 195 an error as soon as possible; that is, when the stream of tokens from the lexical analyzer cannot be parsed further according to the grammar for the language. More precisely, they have the viable-prefix property, meaning that they detect that an error has occurred as soon as they see a prefix of the input that cannot be completed to form a string in the language
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2019-01-08
    • 1970-01-01
    • 2018-06-17
    • 2021-07-24
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    相关资源
    最近更新 更多