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

zel*_*ell 6 java project-management design-patterns

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

是否有更现代的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 {
    ...
    }

...
}
Run Code Online (Sandbox Code Playgroud)

但是,当我来到td3时,我必须更新td2.Cradle的因子(),但我不想在td2.Cradle中更改因子(),因为这会使得td2中的factor()做的比它应该在td2中呈现.我想到了"扩展"td2.Cradle(),但是,扩展静态类似乎是不可能的.

我的相关问题在这里

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

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

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

  1. 每章调用/添加更多行到前面章节中定义的过程
  2. 我希望让我的JAVA源代码对每个想要一步一步遵循LBC的人都有用.因此,使用单个类来放入作者编译器的最终源代码是不合适的.必须按章节分割代码,然后像Crenshaw那样逐渐增加代码.

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

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

Jes*_*eke 1

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