如何支持import语句?

时间:2012-03-03 00:20:36

标签: compiler-construction compilation

我正在手工设计编译器(不要问)。

这种新语言的源文件可以导入它希望与

一起使用的包P中的类T.
import P.T;

或者它可以使用语句

对包P中的所有类进行按需导入访问
import P.*;

出现在ClassType声明中的标识符(即声明MyClass x = ...中的标识符MyClass)通过以下规则解析:

  1. 它可以是当前包中声明的类
  2. 它可以是显式导入的类
  3. 它可以是隐式导入的类(按需导入)
  4. 我不知道真正的编译器如何处理这种情况。我正在寻找一种方法来实现带有import语句的miniJava程序中ClassTypes的识别。

1 个答案:

答案 0 :(得分:1)

在单独的数据结构中跟踪所有三种类型(本地,显式导入,*导入)(在遇到程序中的声明和导入时添加条目)以及何时需要查找类型标识符,检查每个数据结构。

如果您有优先级顺序(例如本地声明影子(隐藏)导入的类),那么只需按顺序检查三个,并在找到某些内容后停止(更像是一个词法范围链)。如果有一个含糊不清的名字是错误的,那么检查所有这三个并保留你找到的所有内容的清单;如果列表后面只有一个元素,则发出错误信号(并在错误消息中列出找到的项目)。

对于*导入,任何给定的import ....*是否提供给定的类名都不明显。为此,只需依次尝试每一个作为子案例(给定import P.*查找MyClass,形成P.MyClass并检查是否存在)。在这种情况下,检查所有*导入尤为重要,这样您就不会在给定不明确名称的情况下默默选择一个选项。