Browse Source

worked on tokenizer, added operators, stripping whitespace out

pull/21/head
Wesley Kerfoot 12 years ago
parent
commit
6021da7665
  1. 16
      parse.js
  2. 17
      representation.js
  3. 56
      tokenize.js

16
parse.js

@ -258,9 +258,9 @@ function pprintName(ident) {
function pprintFunc(func) { function pprintFunc(func) {
if (func.p.exprType === "Name") if (func.p.exprType === "Name")
return "\\ " + pprint(func.p) + " -> " + pprint(func.body); return "(\\ " + pprint(func.p) + " -> " + pprint(func.body) + ")";
else 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") else if (expr.exprType === "Float")
return expr.val; return expr.val;
else if (expr.exprType === "String") else if (expr.exprType === "String")
return expr.val; return '"'+expr.val+'"';
else if (expr.exprType === "Name") else if (expr.exprType === "Name")
return expr.val; return expr.val;
else if (expr.exprType === "Application") else if (expr.exprType === "Application")
@ -307,13 +307,7 @@ function pprint(expr) {
return pprintFunc(expr); return pprintFunc(expr);
} }
var input = fs.readFileSync('/dev/stdin').toString(); 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().filter(function(x) { return x[0] !== "whitespace";});
var tokenized = tokenizer.tokenize(input).reverse();
console.log(tokenized);
//console.log(tokenized);
console.log(parse(tokenized))
//console.log(pprint(parse(tokenized)));
//console.log(tokenized); //console.log(tokenized);
console.log(pprint(parse(tokenized)));

17
representation.js

@ -139,13 +139,16 @@ function makeApp(name, parameters) {
} }
OPInfo = {"+" : [2, "Left"], OPInfo = {"+" : [3, "Left"],
"-" : [2, "Left"], "-" : [3, "Left"],
"*" : [3, "Left"], "*" : [4, "Left"],
"/" : [3, "Left"], "/" : [4, "Left"],
"^" : [4, "Right"], "^" : [5, "Right"],
"++" : [2, "Left"], "++" : [3, "Left"],
"==" : [1, "Left"]} "==" : [2, "Left"],
">" : [2, "Left"],
"<" : [2, "Left"],
"$" : [1, "Left"]}
module.exports = module.exports =
{ IntT : IntT, { IntT : IntT,

56
tokenize.js

@ -56,18 +56,18 @@ function tokenizeNum(tokstream) {
tokstream = tokstream.substr(1); tokstream = tokstream.substr(1);
n++; n++;
} }
return [n, ["Float", parseFloat(number.join(''), 10)]]; return [n, ["float", parseFloat(number.join(''), 10)]];
} }
if (!isFloat) if (!isFloat)
return [n, ["Integer", parseInt(number.join(''), 10)]]; return [n, ["integer", parseInt(number.join(''), 10)]];
else else
return [n, ["Float", parseFloat(number.join(''), 10)]]; return [n, ["float", parseFloat(number.join(''), 10)]];
} }
function tokenizeIdent(tokstream) { function tokenizeIdent(tokstream) {
var identifier = []; var identifier = [];
var n = 0; var n = 0;
while ((!isWhitespace(tokstream[0])) && isIdentifier(tokstream[0])) { while ((!isWhitespace(tokstream[0])) && (!isDigit(tokstream[0])) && isIdentifier(tokstream[0])) {
identifier.push(tokstream[0]); identifier.push(tokstream[0]);
tokstream = tokstream.substr(1); tokstream = tokstream.substr(1);
n++; n++;
@ -164,13 +164,15 @@ function tokenize(tokstream) {
break; break;
case 43: // '+' case 43: // '+'
var result = tokenizeNum(tokstream); if (isDigit(tokstream[1])) {
var num = result[1]; var result = tokenizeNum(tokstream);
var i = result[0]; var num = result[1];
if (num[1] !== NaN) var i = result[0];
tokens.push(num); if (num[1] !== NaN)
tokstream = tokstream.substr(i); tokens.push(num);
break; tokstream = tokstream.substr(i);
break;
}
case 45: // '-' case 45: // '-'
var lambda = peek(tokstream, "arrow", "->"); var lambda = peek(tokstream, "arrow", "->");
if (lambda) { if (lambda) {
@ -178,21 +180,25 @@ function tokenize(tokstream) {
tokstream = tokstream.substr(2); tokstream = tokstream.substr(2);
break; break;
} }
var result = tokenizeNum(tokstream); if (isDigit(tokstream[1])) {
var num = result[1]; var result = tokenizeNum(tokstream);
var i = result[0]; var num = result[1];
if (num[1] !== NaN) var i = result[0];
tokens.push(num); if (num[1] !== NaN)
tokstream = tokstream.substr(i); tokens.push(num);
break; tokstream = tokstream.substr(i);
break;
}
case 46: // '.' case 46: // '.'
var result = tokenizeNum(tokstream); if (isDigit(tokstream[1])) {
var num = result[1]; var result = tokenizeNum(tokstream);
var i = result[0]; var num = result[1];
if (num[1] !== NaN) var i = result[0];
tokens.push(num); if (num[1] !== NaN)
tokstream = tokstream.substr(i); tokens.push(num);
break; tokstream = tokstream.substr(i);
break;
}
case 116: // 't' case 116: // 't'
var result = tokenizeT(tokstream); var result = tokenizeT(tokstream);
if (result) { if (result) {

Loading…
Cancel
Save