编译器如何知道它超出了范围?

时间:2011-05-17 23:31:45

标签: c# compiler-construction scope

Main()
{
  int i =0;
  ...
  ...
  while(true)
  {
   int k =0;
   ...
   ...
  }
// K is out of scope..
}

编译器如何知道K超出范围?

4 个答案:

答案 0 :(得分:6)

  

编译器如何知道[局部变量]超出范围?

首先,让我们仔细定义您正在使用的术语。命名实体的范围程序文本的区域,在该区域中使用实体名称是合法的,无需额外的名称

本地变量的范围由规范定义为程序文本的区域,整个块 立即包含声明。

编译器通过跟踪与每个语法块关联的本地声明空间来确定局部变量的范围。当我们需要解析一个名字时,我们会找出名称用法的内容,并查阅相关的声明空间。当然,块嵌套,局部变量声明空间也是如此,因此我们可能需要从内到外的顺序查询多个。

我们使用的实际数据结构是简单的哈希表,经过优化,可快速查找和过滤编译器所需的各个方面。 (例如,我们有时需要查找名称,但只想获取类型,或仅获取方法,等等。)

这会回答你的问题吗?这是一个相当不明确的问题。

答案 1 :(得分:4)

因为当编译器处理代码时,它会维护有关它遇到的每个标识符的信息以及它遇到的每个范围并保持后者的边界。它知道K在while范围内声明,并且在范围结束后它可能将变量标记为“不再在范围内”,导致任何使用被标记为错误。

答案 2 :(得分:1)

k超出了范围,因为它定义的块已关闭。

答案 3 :(得分:1)

我会说这是一个毫无意义的问题。 K超出了范围,因为你编写了这样的程序:编译器的整个函数是识别和翻译编程语言,包括它的词法范围方面。