From 252798b1340abb86c34f3b036498892714b2b8c8 Mon Sep 17 00:00:00 2001 From: nisstyre56 Date: Tue, 3 Jun 2014 01:12:05 -0400 Subject: [PATCH] return type alias bindings along with ast --- desugar.js | 22 +++++++++++++--------- free_vars.js | 6 +++--- parse.js | 11 ++++++++--- typecheck.js | 1 - 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/desugar.js b/desugar.js index 9da5d4e..2c9d9be 100644 --- a/desugar.js +++ b/desugar.js @@ -57,30 +57,34 @@ function sugarTypeDecl(stx) { return new typ.TypeDecl(expression, type); } -function desugarDefType(stx) { +function desugarDefType(stx, typeEnv) { 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.charnum = stx.charnum; return result; } -function desugar(stx) { +function desugar(stx, typeAliases, typeEnv) { var typeExpTest; switch (stx.exprType) { case "If": 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": return desugarDefFunc(stx); case "Definition": - return new typ.Def(stx.ident, desugar(stx.val)); + return new typ.Def(stx.ident, desugar(stx.val, typeEnv)); case "TypeDefinition": - return desugarDefType(stx); + return desugarDefType(stx, typeEnv); case "Name": return stx; case "Application": @@ -104,10 +108,10 @@ function desugar(stx) { if ((stx.func.ident === "-" || stx.func.ident === "+") && 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) { - 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); case "Function": diff --git a/free_vars.js b/free_vars.js index 602c31d..bb57da3 100644 --- a/free_vars.js +++ b/free_vars.js @@ -149,11 +149,11 @@ function annotate_fvs_all(stx) { function test(src) { - var ast = parser.parse(src)[0]; - console.log(JSON.stringify(annotate_fvs_all(ast), null, 4)); + var ast = parser.parse(src); + console.log(JSON.stringify(ast.map(annotate_fvs_all), null, 4)); } -//console.log(test("if something then if a then if b then c else d else rtrrt else some_other_thing")); +console.log(test("if something then if a then if b then c else d else rtrrt else some_other_thing")); module.export = { test : test, annotate_fvs: annotate_fvs_all diff --git a/parse.js b/parse.js index 2c4e23a..5da6f0f 100755 --- a/parse.js +++ b/parse.js @@ -807,11 +807,12 @@ function parse(tokens) { function parseFull(tokenized) { var ast = []; + var typeBindings = {}; try { while (tokenized.length > 0) { - ast.push(desugarer.desugar(parse(tokenized))); + ast.push(desugarer.desugar(parse(tokenized), typeBindings)); } - return ast; + return [ast, typeBindings]; } catch (e) { if (e.stxerror !== undefined) { e.stxerror(); @@ -829,5 +830,9 @@ module.exports = { parse : function(str) { }, tokenize : tokenizer.tokenize }; +/* var istr = fs.readFileSync('/dev/stdin').toString(); -console.log(parseFull(tokenizer.tokenize(istr)).map(pprint.pprint)); +var testParse = parseFull(tokenizer.tokenize(istr)); +console.log(testParse[1]); +console.log(testParse[0].map(pprint.pprint)); +*/ diff --git a/typecheck.js b/typecheck.js index e105e94..c39306c 100644 --- a/typecheck.js +++ b/typecheck.js @@ -16,4 +16,3 @@ var env = require("./environments.js"); /* * Map all bindings with explicit type annotations in the environment */ -function gather_annotations(stx) {