Browse Source

cleaned up/modularized code more

pull/21/head
Wesley Kerfoot 11 years ago
parent
commit
2bc760774b
  1. 75
      parse.js
  2. 58
      pprint.js
  3. 3
      representation.js
  4. 13
      tokenize.js

75
parse.js

@ -5,6 +5,9 @@ var tool = require("./tools.js");
var tokenizer = require("./tokenize.js");
var desugarer = require("./desugar.js");
var fs = require("fs");
var pprint = require("./pprint.js").pprint;
var print = console.log;
function fst(ts) {
return ts[ts.length-1];
@ -322,68 +325,14 @@ function parse(tokens) {
}
}
function pprintName(ident) {
return pprint(ident.val);
}
function pprintFunc(func) {
if (func.p.exprType === "Name")
return "(\\ " + pprint(func.p) + " -> " + pprint(func.body) + ")";
else
return "(\\ " + func.p.map(pprint).join(" ") + " -> " + pprint(func.body) + ")";
}
function pprintApp(app) {
if (!app.p || app.p === undefined)
return pprint(app.func);
return "((" + pprint(app.func) + ") " + pprint(app.p) + ")";
}
function pprintDef(def) {
return pprint(def.ident) + " = " + pprint(def.val);
}
function pprintIf(ifexp) {
if (ifexp.elseexp)
return "(if " + pprint(ifexp.condition) + " then " + pprint(ifexp.thenexp) + " else " + pprint(ifexp.elseexp) + ")";
else
return "(if " + pprint(ifexp.condition) + " then " + pprint(ifexp.thenexp) + ")";
}
function pprint(expr) {
if (expr.exprType === "Name")
return expr.val;
else if (expr.exprType === "Bool")
if (expr.val)
return "True";
else
return "False";
else if (expr.exprType === "Integer")
return expr.val;
else if (expr.exprType === "Float")
return expr.val;
else if (expr.exprType === "String")
return '"'+expr.val+'"';
else if (expr.exprType === "Name")
return expr.val;
else if (expr.exprType === "Application")
return pprintApp(expr);
else if (expr.exprType === "Definition")
return pprintDef(expr);
else if (expr.exprType === "If")
return pprintIf(expr);
else if (expr.exprType === "Function")
return pprintFunc(expr);
else if (expr.exprType === "Nil")
return "[]";
//var tokenized = tokenizer.tokenize(fs.readFileSync('/dev/stdin').toString());
function parseFull(tokenized) {
var ast = new Array();
while (tokenized.length > 0) {
var parsed = desugarer.desugar(parse(tokenized));
ast.push(parsed);
}
return ast;
}
var input = fs.readFileSync('/dev/stdin').toString();
var tokenized = tokenizer.tokenize(input).reverse().filter(function(x) { return x[0] !== "whitespace";});
//console.log(tokenized);
while (tokenized !== []) {
console.log(pprint(desugarer.desugar(parse(tokenized))));
if (!tokenized)
break;
}
module.exports = {parse : tool.compose(parseFull, tokenizer.tokenize) };

58
pprint.js

@ -0,0 +1,58 @@
function pprintName(ident) {
return pprint(ident.val);
}
function pprintFunc(func) {
if (func.p.exprType === "Name")
return "(\\ " + pprint(func.p) + " -> " + pprint(func.body) + ")";
else
return "(\\ " + func.p.map(pprint).join(" ") + " -> " + pprint(func.body) + ")";
}
function pprintApp(app) {
if (!app.p || app.p === undefined)
return pprint(app.func);
return "((" + pprint(app.func) + ") " + pprint(app.p) + ")";
}
function pprintDef(def) {
return pprint(def.ident) + " = " + pprint(def.val);
}
function pprintIf(ifexp) {
if (ifexp.elseexp)
return "(if " + pprint(ifexp.condition) + " then " + pprint(ifexp.thenexp) + " else " + pprint(ifexp.elseexp) + ")";
else
return "(if " + pprint(ifexp.condition) + " then " + pprint(ifexp.thenexp) + ")";
}
function pprint(expr) {
if (expr.exprType === "Name")
return expr.val;
else if (expr.exprType === "Bool")
if (expr.val)
return "True";
else
return "False";
else if (expr.exprType === "Integer")
return expr.val;
else if (expr.exprType === "Float")
return expr.val;
else if (expr.exprType === "String")
return '"'+expr.val+'"';
else if (expr.exprType === "Name")
return expr.val;
else if (expr.exprType === "Application")
return pprintApp(expr);
else if (expr.exprType === "Definition")
return pprintDef(expr);
else if (expr.exprType === "If")
return pprintIf(expr);
else if (expr.exprType === "Function")
return pprintFunc(expr);
else if (expr.exprType === "Nil")
return "[]";
}
module.exports = {pprint : pprint};

3
representation.js

@ -167,7 +167,8 @@ OPInfo = {"+" : [3, "Left"],
":" : [2, "Left"],
"$" : [1, "Left"],
">>" : [1, "Left"],
">>=" : [1, "Left"]}
">>=" : [1, "Left"],
"<$>" : [1, "Left"]}
module.exports =
{ IntT : IntT,

13
tokenize.js

@ -289,10 +289,17 @@ function tokenize(tokstream) {
return tokens;
}
module.exports = {tokenize : tokenize};
function tokenizeFull(input) {
return tokenize(input).reverse().filter(function(x) {
return x[0] !== "whitespace";
});
}
module.exports = {tokenize : tokenizeFull};
var tokstream = fs.readFileSync("/dev/stdin").toString();
console.log(tokenize(tokstream));
//var tokstream = fs.readFileSync("/dev/stdin").toString();
//console.log(tokenize(tokstream));
//console.log(tools.buildTrie('', operators)[1][6]);
//console.log(isIdentifier(')'));
//console.log(tools.maxBy(tools.len, operators.filter(function (x) { return "#".indexOf(x) != -1;})));

Loading…
Cancel
Save