diff --git a/parse.js b/parse.js index dc49e88..225e140 100755 --- a/parse.js +++ b/parse.js @@ -258,9 +258,9 @@ function pprintName(ident) { function pprintFunc(func) { if (func.p.exprType === "Name") - return "\\ " + pprint(func.p) + " -> " + pprint(func.body); + return "(\\ " + pprint(func.p) + " -> " + pprint(func.body) + ")"; else - return "\\ " + func.p.map(pprint).join(" ") + " -> " + pprint(func.body); + return "(\\ " + func.p.map(pprint).join(" ") + " -> " + pprint(func.body) + ")"; } @@ -294,7 +294,7 @@ function pprint(expr) { else if (expr.exprType === "Float") return expr.val; else if (expr.exprType === "String") - return expr.val; + return '"'+expr.val+'"'; else if (expr.exprType === "Name") return expr.val; else if (expr.exprType === "Application") @@ -307,13 +307,7 @@ function pprint(expr) { return pprintFunc(expr); } - - var input = fs.readFileSync('/dev/stdin').toString(); -//var input = process.argv.slice(2).reduce(function(acc, x) {return acc + " " + x}, ""); -var tokenized = tokenizer.tokenize(input).reverse(); -console.log(tokenized); -//console.log(tokenized); -console.log(parse(tokenized)) -//console.log(pprint(parse(tokenized))); +var tokenized = tokenizer.tokenize(input).reverse().filter(function(x) { return x[0] !== "whitespace";}); //console.log(tokenized); +console.log(pprint(parse(tokenized))); diff --git a/representation.js b/representation.js index 4d43c65..9734881 100644 --- a/representation.js +++ b/representation.js @@ -139,13 +139,16 @@ function makeApp(name, parameters) { } -OPInfo = {"+" : [2, "Left"], - "-" : [2, "Left"], - "*" : [3, "Left"], - "/" : [3, "Left"], - "^" : [4, "Right"], - "++" : [2, "Left"], - "==" : [1, "Left"]} +OPInfo = {"+" : [3, "Left"], + "-" : [3, "Left"], + "*" : [4, "Left"], + "/" : [4, "Left"], + "^" : [5, "Right"], + "++" : [3, "Left"], + "==" : [2, "Left"], + ">" : [2, "Left"], + "<" : [2, "Left"], + "$" : [1, "Left"]} module.exports = { IntT : IntT, diff --git a/tokenize.js b/tokenize.js index 8609501..97aa22c 100755 --- a/tokenize.js +++ b/tokenize.js @@ -56,18 +56,18 @@ function tokenizeNum(tokstream) { tokstream = tokstream.substr(1); n++; } - return [n, ["Float", parseFloat(number.join(''), 10)]]; + return [n, ["float", parseFloat(number.join(''), 10)]]; } if (!isFloat) - return [n, ["Integer", parseInt(number.join(''), 10)]]; + return [n, ["integer", parseInt(number.join(''), 10)]]; else - return [n, ["Float", parseFloat(number.join(''), 10)]]; + return [n, ["float", parseFloat(number.join(''), 10)]]; } function tokenizeIdent(tokstream) { var identifier = []; var n = 0; - while ((!isWhitespace(tokstream[0])) && isIdentifier(tokstream[0])) { + while ((!isWhitespace(tokstream[0])) && (!isDigit(tokstream[0])) && isIdentifier(tokstream[0])) { identifier.push(tokstream[0]); tokstream = tokstream.substr(1); n++; @@ -164,13 +164,15 @@ function tokenize(tokstream) { break; case 43: // '+' - var result = tokenizeNum(tokstream); - var num = result[1]; - var i = result[0]; - if (num[1] !== NaN) - tokens.push(num); - tokstream = tokstream.substr(i); - break; + if (isDigit(tokstream[1])) { + var result = tokenizeNum(tokstream); + var num = result[1]; + var i = result[0]; + if (num[1] !== NaN) + tokens.push(num); + tokstream = tokstream.substr(i); + break; + } case 45: // '-' var lambda = peek(tokstream, "arrow", "->"); if (lambda) { @@ -178,21 +180,25 @@ function tokenize(tokstream) { tokstream = tokstream.substr(2); break; } - var result = tokenizeNum(tokstream); - var num = result[1]; - var i = result[0]; - if (num[1] !== NaN) - tokens.push(num); - tokstream = tokstream.substr(i); - break; + if (isDigit(tokstream[1])) { + var result = tokenizeNum(tokstream); + var num = result[1]; + var i = result[0]; + if (num[1] !== NaN) + tokens.push(num); + tokstream = tokstream.substr(i); + break; + } case 46: // '.' - var result = tokenizeNum(tokstream); - var num = result[1]; - var i = result[0]; - if (num[1] !== NaN) - tokens.push(num); - tokstream = tokstream.substr(i); - break; + if (isDigit(tokstream[1])) { + var result = tokenizeNum(tokstream); + var num = result[1]; + var i = result[0]; + if (num[1] !== NaN) + tokens.push(num); + tokstream = tokstream.substr(i); + break; + } case 116: // 't' var result = tokenizeT(tokstream); if (result) {