0

我最近一直在为基本的编程语言编写解释器,一切正常。但是,有人可以建议我添加对双打的支持的最佳方法。目前只支持整数,但我也想添加对双精度数的支持。

4

2 回答 2

4

输入环境 a = [[Var, a]]

这是一个类型家族。Env Int是 int 环境,Env Double是 double 环境,依此类推。这不是一个可以同时保存整数和双精度的类型,这可能是您需要的。

可以同时保存整数和双精度的类型可能如下所示:

data Val = IntNum Int | DoubleNum Double

然后您可以将环境设置为

type Env = [ (Var, Val) ]

(我不知道您为什么在这里使用列表列表)。

您需要为IntNumDoubleNum情况分别定义算术运算(如果您的语言支持,也可能为混合操作数定义)。

添加布尔值和列表很简单,只需在Val.

您将不得不处理您的语言中出现的类型错误,因为它开始支持多种类型。我不认为这种简单的设计非常适合静态类型安全的语言。如果你想要这样,设计必须进行重大调整。

于 2012-06-15T18:51:25.017 回答
2

简单的答案是定义一个可以保存 etherIntDoubles 的变体类型,例如

data Value = Int Int
           | Double Double

并相应修改Env和其他类型的定义:

type Env = [[(Var, Value)]]

data ValExpr = IVar Var
             | IVal Value
             ...

但是如果您打算添加更多类型,我会考虑使用GADT

编辑:错字

于 2012-06-15T18:38:43.023 回答