重写Crenshaw的“让我们构建一个编译器”的设计模式?

时间:2012-05-05 15:04:39

标签: java design-patterns project-management

我正在重写Jack Crenshaw的“让我们构建一个编译器”,从Turbo Pascal 4.0到JAVA。这是激励因为经典书籍还没有O-O版本

Is there a more modern, OO version of "Let's Build a Compiler"?

这本书包含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中比在td2中应该提供的更多。我想到了“扩展”td2.Cradle(),但是,扩展静态类似乎是不可能的。

My related question here

我是否应该将每个静态方法更改为非静态方法?

我当然需要一些设计模式,任何人都可以提供帮助吗?我希望我很清楚。总之,这个项目逐步为每个过程提供越来越多的指令,我希望使用一些JAVA机制(如继承)记录中间步骤。

Pascal代码是经典书籍LBC。我觉得尝试使用继承,因为

  1. 每章调用/添加更多行到前面章节
  2. 中定义的过程
  3. 我希望让我的JAVA源代码对每个想要一步一步遵循LBC的人都有用。因此,使用单个类来放入作者编译器的最终源代码是不合适的。必须按章节分割代码,然后像Crenshaw那样逐渐增加代码。
  4. 我的实际解决方案是将tp1.Cradle的方法保持为静态。 tp2.Cradle,tp3.Cradle,...中的方法,直到tp15.Cradle将是非静态的,并且它们都静态导入 tp1.Cradle。*。此外,对于大于2的每个整数,tp [i] .Cradle 扩展 tp [i-1] .Cradle。

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

1 个答案:

答案 0 :(得分:1)

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