我正在手工设计编译器(不要问)。
这种新语言的源文件可以导入它希望与
一起使用的包P中的类T.import P.T;
或者它可以使用语句
对包P中的所有类进行按需导入访问import P.*;
出现在ClassType声明中的标识符(即声明MyClass x = ...中的标识符MyClass)通过以下规则解析:
我不知道真正的编译器如何处理这种情况。我正在寻找一种方法来实现带有import语句的miniJava程序中ClassTypes的识别。
答案 0 :(得分:1)
在单独的数据结构中跟踪所有三种类型(本地,显式导入,*
导入)(在遇到程序中的声明和导入时添加条目)以及何时需要查找类型标识符,检查每个数据结构。
如果您有优先级顺序(例如本地声明影子(隐藏)导入的类),那么只需按顺序检查三个,并在找到某些内容后停止(更像是一个词法范围链)。如果有一个含糊不清的名字是错误的,那么检查所有这三个并保留你找到的所有内容的清单;如果列表后面只有一个元素,则发出错误信号(并在错误消息中列出找到的项目)。
对于*
导入,任何给定的import ....*
是否提供给定的类名都不明显。为此,只需依次尝试每一个作为子案例(给定import P.*
查找MyClass
,形成P.MyClass
并检查是否存在)。在这种情况下,检查所有*
导入尤为重要,这样您就不会在给定不明确名称的情况下默默选择一个选项。