Skip to content

Latest commit

 

History

History
23 lines (15 loc) · 2.13 KB

02_Interpreter.md

File metadata and controls

23 lines (15 loc) · 2.13 KB

《《《 返回首页
《《《 上一节

翻译员

树的一种用法是用编程语言表示表达式。如前一节所述,表达式类型由一个抽象类表示,每种表达式都由一个子类表示。有一种抽象方法来评估一个表达式,并且每个子类都根据相应的表达式实现该方法。

使用泛型时,可以通过表达式的类型对表达式类型进行参数化。例如,Exp<Integer> 是一个返回整数的表达式,而 Exp<Pair<Integer,Integer>> 是一个返回一对整数的表达式。

9-4 演示了具有泛型的解释器模式。它首先定义一个类 Pair<A,B>,并带有一个构造函数和两个方法来选择一对的左右分量。然后它为一个抽象类 Exp<A> 声明一个返回 A 类型值的表达式,抽象方法 eval 返回 A 类型的值。在我们的例子中,有五种表达式:

  • Exp<Integer> 类型的整数文字
  • Exp<Integer> 类型的和表达式,它有两个子表达式,每个类型都是 Exp<Integer>
  • 一个表达式,用于构造 Exp<Pair<A,B>> 类型的对,该对具有 Exp<A>Exp<B> 类型的两个子表达式。
  • 一个表达式,用于选择 Exp<A> 类型的一个对的左侧组件,它具有 Exp<Pair<A,B>> 类型的子表达式。
  • 一个表达式,用于选择 Exp<B> 类型的对的右部分,它具有类型 Exp<Pair<A,B>> 的子表达式。

有五种静态方法对应于五种表达式,每种都返回表达式类的适当子类的实例,并具有适当的 eval 方法定义。最后,主要方法构造并评估示例表达式。

Java 中的泛型受到功能语言(如 MLHaskell )中类似功能的启发。通用的解释器模式很有趣,因为它展示了一种Java中的泛型比其他语言中的泛型更强大的方式。虽然最近的 Haskell 版本包含了一个实验性特征,即通用抽象数据类型,它专门为支持这种模式而设计,但在 MLHaskell 的标准版本中实现这种模式是不可能的。

《《《 下一节
《《《 返回首页