Compiler construction 如何支持导入语句?

Compiler construction 如何支持导入语句?,compiler-construction,compilation,Compiler Construction,Compilation,我正在手工设计一个编译器(不要问) 这种新语言的源文件可以导入它希望与之一起使用的包p中的类T import P.T; 或者,它可以使用import-on-demand语句访问包p中的所有类 import P.*; 类类型声明中出现的标识符(即声明MyClass x=…)由以下规则解析: 它可以是当前包中声明的类 它可以是显式导入的类 它可以是隐式导入的类(按需导入) 我不知道真正的编译器是如何处理这种情况的。我正在寻找一种在miniJava程序中使用import语句实现类类型标识的方法。在

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

这种新语言的源文件可以导入它希望与之一起使用的包p中的类T

import P.T;
或者,它可以使用import-on-demand语句访问包p中的所有类

import P.*;
类类型声明中出现的标识符(即声明MyClass x=…)由以下规则解析:

  • 它可以是当前包中声明的类
  • 它可以是显式导入的类
  • 它可以是隐式导入的类(按需导入)

  • 我不知道真正的编译器是如何处理这种情况的。我正在寻找一种在miniJava程序中使用import语句实现类类型标识的方法。

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

    如果您有一个优先级顺序(例如,本地声明阴影(hide)导入的类),那么只需按该顺序检查这三个类,并在找到某个类时停止(更像是词法范围链)。如果名字模棱两可是一个错误,那么检查所有三个,并保留一个你发现的所有东西的列表;如果列表后面只有一个元素,则发出错误信号(并在错误消息中列出找到的项)

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