|
@ -57,30 +57,34 @@ function sugarTypeDecl(stx) { |
|
|
return new typ.TypeDecl(expression, type); |
|
|
return new typ.TypeDecl(expression, type); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function desugarDefType(stx) { |
|
|
function desugarDefType(stx, typeEnv) { |
|
|
var result; |
|
|
var result; |
|
|
result = new typ.DefType(desugar(stx.lhs), desugar(stx.rhs)); |
|
|
var rhs = desugar(stx.rhs); |
|
|
|
|
|
var name = stx.lhs.name; |
|
|
|
|
|
typeEnv[name] = rhs; |
|
|
|
|
|
|
|
|
|
|
|
result = new typ.DefType(stx.lhs, desugar(stx.rhs)); |
|
|
result.linenum = stx.linenum; |
|
|
result.linenum = stx.linenum; |
|
|
result.charnum = stx.charnum; |
|
|
result.charnum = stx.charnum; |
|
|
return result; |
|
|
return result; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function desugar(stx) { |
|
|
function desugar(stx, typeEnv) { |
|
|
var typeExpTest; |
|
|
var typeExpTest; |
|
|
|
|
|
|
|
|
switch (stx.exprType) { |
|
|
switch (stx.exprType) { |
|
|
case "If": |
|
|
case "If": |
|
|
if (stx.elseexp) { |
|
|
if (stx.elseexp) { |
|
|
return new typ.If(desugar(stx.condition), desugar(stx.thenexp), desugar(stx.elseexp)); |
|
|
return new typ.If(desugar(stx.condition, typeEnv), desugar(stx.thenexp, typeEnv), desugar(stx.elseexp, typeEnv)); |
|
|
} |
|
|
} |
|
|
return new typ.If(desugar(stx.condition), desugar(stx.thenexp)); |
|
|
return new typ.If(desugar(stx.condition, typeEnv), desugar(stx.thenexp, typeEnv)); |
|
|
case "FunctionDefinition": |
|
|
case "FunctionDefinition": |
|
|
return desugarDefFunc(stx); |
|
|
return desugarDefFunc(stx); |
|
|
case "Definition": |
|
|
case "Definition": |
|
|
return new typ.Def(stx.ident, desugar(stx.val)); |
|
|
return new typ.Def(stx.ident, desugar(stx.val, typeEnv)); |
|
|
case "TypeDefinition": |
|
|
case "TypeDefinition": |
|
|
return desugarDefType(stx); |
|
|
return desugarDefType(stx, typeEnv); |
|
|
case "Name": |
|
|
case "Name": |
|
|
return stx; |
|
|
return stx; |
|
|
case "Application": |
|
|
case "Application": |
|
@ -104,10 +108,10 @@ function desugar(stx) { |
|
|
if ((stx.func.ident === "-" || |
|
|
if ((stx.func.ident === "-" || |
|
|
stx.func.ident === "+") && |
|
|
stx.func.ident === "+") && |
|
|
stx.p) { |
|
|
stx.p) { |
|
|
return new typ.UnaryOp(desugar(stx.func), desugar(stx.p)); |
|
|
return new typ.UnaryOp(desugar(stx.func, typeEnv), desugar(stx.p, typeEnv)); |
|
|
} |
|
|
} |
|
|
if (stx.p) { |
|
|
if (stx.p) { |
|
|
return new typ.App(desugar(stx.func), desugar(stx.p)); |
|
|
return new typ.App(desugar(stx.func, typeEnv), desugar(stx.p, typeEnv)); |
|
|
} |
|
|
} |
|
|
return new typ.App(stx.func); |
|
|
return new typ.App(stx.func); |
|
|
case "Function": |
|
|
case "Function": |
|
|