我正在将 Jack Crenshaw 的“让我们构建一个编译器”从 Turbo Pascal 4.0 重写为 JAVA。这很励志,因为经典书籍还没有面向对象的版本
全书共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。我觉得尝试使用继承是因为
- 每一章都调用/添加更多行到前面章节中定义的程序
- 我希望让我的 JAVA 源代码对所有想要一步一步关注 LBC 的人有用。所以不宜使用单个类来放入作者编译器的最终源代码。必须像 Crenshaw 那样按章节拆分代码并逐渐增加它们。
我的实际解决方案是将 tp1.Cradle 的方法保持为静态。tp2.Cradle, tp3.Cradle, ... 直到 tp15.Cradle 中的方法都是非静态的,它们都静态导入tp1.Cradle.* 。此外,对于每个大于 2 的整数 i,tp[i].Cradle扩展tp[i-1].Cradle。
不要犹豫,告诉我更好的解决方案。