6

我正在将 Jack Crenshaw 的“让我们构建一个编译器”从 Turbo Pascal 4.0 重写为 JAVA。这很励志,因为经典书籍还没有面向对象的版本

是否有更现代的 OO 版本的“让我们构建编译器”?

全书共15章。编译器以增量的方式呈现:第一章提供了整个编译器的样板代码,然后每章都在前一章的 Pascal 过程中添加了一些行。

我已经翻译了前两章,每一章都作为一个包,每个 Pascal 过程作为 JAVA 中的静态保护方法,一章的过程集中在一个类中,该类扩展了从其前一章翻译的类。

package td1;
public class Cradle {
    protected final static char TAB='\t';
    protected static char look;

    protected static void getChar() throws IOException {
        look=(char) System.in.read();
        }       
 ...
}

package td2;

public class Cradle extends td1.Cradle{

    protected static void factor() throws IOException {
    ...
    }

...
}

但是,当我来到td3时,我必须更新td2.Cradle的factor(),但我不想在td2.Cradle中更改factor(),因为那样会使td2中的factor()做得更多它应该在 td2 中提出。我想到了“扩展” td2.Cradle(),但是,扩展静态类似乎是不可能的。

我的相关问题在这里

也许我应该将每个静态方法更改为非静态方法?

我当然需要一些设计模式,有人可以帮忙吗?我希望我很清楚。总而言之,这个项目逐渐地为每个过程提供了越来越多的指令,我确实希望使用一些像继承这样的 JAVA 机制来记录中间步骤。

帕斯卡代码是经典的书籍在这里LBC。我觉得尝试使用继承是因为

  1. 每一章都调用/添加更多行到前面章节中定义的程序
  2. 我希望让我的 JAVA 源代码对所有想要一步一步关注 LBC 的人有用。所以不宜使用单个类来放入作者编译器的最终源代码。必须像 Crenshaw 那样按章节拆分代码并逐渐增加它们。

我的实际解决方案是将 tp1.Cradle 的方法保持为静态。tp2.Cradle, tp3.Cradle, ... 直到 tp15.Cradle 中的方法都是非静态的,它们都静态导入tp1.Cradle.* 。此外,对于每个大于 2 的整数 i,tp[i].Cradle扩展tp[i-1].Cradle。

不要犹豫,告诉我更好的解决方案。

4

1 回答 1

1

听起来你在正确的轨道上。为了能够覆盖这些方法,它们应该是实例方法。因此,您应该从依赖这些“全局方法”的模型转移到基于实例的模型,在其中创建 Cradle 类的实例并在该实例上调用适当的方法。

于 2012-05-06T06:40:53.847 回答