【问题标题】:do we need to check the inheritance graph of a single-inherited language for loops?我们是否需要检查单继承语言的继承图以进行循环?
【发布时间】:2015-02-17 03:56:17
【问题描述】:

我正在尝试为“COOL”语言编写编译器。正如该语言手册中所写的那样,每个类最多只能有一个父类,而无父类是“对象”类的子类。

对于编译器的语义分析阶段,我们需要检查继承层次中是否没有循环。例如,如果a类是b类的父类,b类是c类的父类,那么c类不能是a的父类!

但我开始意识到,对于单一继承的语言,如果我们给无父类,“对象”作为它们的父类,继承图中不可能有循环。我们只需要看看代码中是否没有任何地方,是否有人为“对象”声明了父亲!

我说的对吗?

【问题讨论】:

    标签: inheritance graph compiler-construction semantics


    【解决方案1】:

    考虑以下两个类:

    class A extends B {}
    
    class B extends A {}
    

    在某些语言中,尤其是 C++,上面的内容是非法的,因为你不能在 B 声明之前引用它,你不能从一个只被前向声明的类继承。所以在这样的语言中,不需要显式的循环检查,因为不可能在不遇到其他错误的情况下构造这样的循环。

    但是,在许多其他语言中,包括 Java、C# 和可能是 COOL,完全有可能从仅在文件稍后定义的类(或在不同文件中定义而无需担心包含顺序)继承。所以在那些语言中,上面的代码是合法的,除非编译器显式检测到循环并因此拒绝代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      相关资源
      最近更新 更多