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) {
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)));

17
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,

56
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) {

Loading…
Cancel
Save