设计编译器 - 加入和满足类型

时间:2016-04-09 02:10:34

标签: types compiler-construction typechecking type-systems

我正在使用SML为另一种函数式语言设计编译器(你可以在这里看到它的定义http://corelab.postech.ac.kr/~hanjun/2016S_compiler/hw/fun_language_definition.php)。我的任务是设计一个类型检查。 什么是返回类型? if a>0 then <<3, 4>, 5> else <<6>, 7, 8>

为了回答这个问题,我需要找到&#34;加入&#34;以上2种类型。 &#34;加入&#34;:是最不常见的超类型。例如,t1 <: t3t2 <: t3 => t3join(t1,t2)。 &#34;满足&#34;是最常见的亚型。 t3 <: t1t3 <: t2 => t3meet(t1, t2)

我的设计任务满足并加入相互递归。 能否请你给我一个如何实施它们的提示?

1 个答案:

答案 0 :(得分:0)

您需要研究子类型规则以推断递归定义。例如,使用元组类型。由于较长的元组是较短元素的子类型,因此公共前缀类型匹配,如果元素类型是成对子类型,则一个元组类型是花药的子类型,您将拥有:

join(<t1, ... tm>, <u1, ... un>) = <join(t1,u1), ... join(tp,up)>
    where p = min(m,n)

meet(<t1, ... tm>, <u1, ... un>) = <meet(t1,u1), ... meet(tm,um), u_m+1, ... un> 
    when (wlog) m <= n

大多数规则都是这样的自我递归。由于参数反转,异常将是函数类型。在这里,你需要见面来定义连接,反之亦然。通过给出答案,我不会破坏你的乐趣。

基本情况当然只是

meet(int, int) = join(int, int) = int