|
|
@ -17,6 +17,11 @@ function isWhitespace(a) { |
|
|
|
return (code === 9 || code === 32 || code === 10 || code === 13 || code === 11); |
|
|
|
} |
|
|
|
|
|
|
|
function isIdentifier(a) { |
|
|
|
var code = a.charCodeAt(); |
|
|
|
return code !== 41 && code !== 40 && code && 125 && code && 123 && code !== 93 && code !== 91 && code !== 44; |
|
|
|
} |
|
|
|
|
|
|
|
function tokenizeNum(tokstream) { |
|
|
|
var number = []; |
|
|
|
var code = tokstream[0].charCodeAt(); |
|
|
@ -62,7 +67,7 @@ function tokenizeNum(tokstream) { |
|
|
|
function tokenizeIdent(tokstream) { |
|
|
|
var identifier = []; |
|
|
|
var n = 0; |
|
|
|
while (!(isWhitespace(tokstream[0]) || tokstream[0].charCodeAt() === 34)) { |
|
|
|
while ((!isWhitespace(tokstream[0])) && isIdentifier(tokstream[0])) { |
|
|
|
identifier.push(tokstream[0]); |
|
|
|
tokstream = tokstream.substr(1); |
|
|
|
n++; |
|
|
@ -93,11 +98,20 @@ function tokenizeT(tokstream) { |
|
|
|
return false; |
|
|
|
var next4 = tokstream.substr(0,4); |
|
|
|
if (next4 === "then") |
|
|
|
return ["then-exp", "then"]; |
|
|
|
return ["thenexp", "then"]; |
|
|
|
else if (next4 === "true") |
|
|
|
return ["bool", "true"]; |
|
|
|
else |
|
|
|
return ["truelit", "true"]; |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
function peek(tokstream, toktype, word) { |
|
|
|
var n = word.length; |
|
|
|
if (tokstream.length < n) |
|
|
|
return false; |
|
|
|
var nextN = tokstream.substr(0, n); |
|
|
|
if (nextN == word) |
|
|
|
return [toktype, word]; |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
function tokenize(tokstream) { |
|
|
@ -158,6 +172,12 @@ function tokenize(tokstream) { |
|
|
|
tokstream = tokstream.substr(i); |
|
|
|
break; |
|
|
|
case 45: // '-'
|
|
|
|
var lambda = peek(tokstream, "arrow", "->"); |
|
|
|
if (lambda) { |
|
|
|
tokens.push(lambda); |
|
|
|
tokstream = tokstream.substr(2); |
|
|
|
break; |
|
|
|
} |
|
|
|
var result = tokenizeNum(tokstream); |
|
|
|
var num = result[1]; |
|
|
|
var i = result[0]; |
|
|
@ -167,7 +187,7 @@ function tokenize(tokstream) { |
|
|
|
break; |
|
|
|
case 46: // '.'
|
|
|
|
var result = tokenizeNum(tokstream); |
|
|
|
var num = result[1]; |
|
|
|
var num = result[1]; |
|
|
|
var i = result[0]; |
|
|
|
if (num[1] !== NaN) |
|
|
|
tokens.push(num); |
|
|
@ -180,6 +200,44 @@ function tokenize(tokstream) { |
|
|
|
tokstream = tokstream.substr(4); // 4 = length of either token
|
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case 105: // 'i'
|
|
|
|
var result = peek(tokstream, "ifexp", "if"); |
|
|
|
if (result) { |
|
|
|
tokens.push(result); |
|
|
|
tokstream = tokstream.substr(2); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case 100: // 'd'
|
|
|
|
var result = peek(tokstream, "def", "def"); |
|
|
|
if (result) { |
|
|
|
tokens.push(result); |
|
|
|
tokstream = tokstream.substr(3); |
|
|
|
break; |
|
|
|
} |
|
|
|
case 101: // e
|
|
|
|
var result = peek(tokstream, "elsexp", "else"); |
|
|
|
if (result) { |
|
|
|
tokens.push(result); |
|
|
|
tokstream = tokstream.substr(4); |
|
|
|
break; |
|
|
|
} |
|
|
|
case 102: // f
|
|
|
|
var result = peek(tokstream, "falselit", "false"); |
|
|
|
if (result) { |
|
|
|
tokens.push(result); |
|
|
|
tokstream = tokstream.substr(5); |
|
|
|
break; |
|
|
|
} |
|
|
|
case 108: // l
|
|
|
|
var result = peek(tokstream, "lambda", "lambda"); |
|
|
|
if (result) { |
|
|
|
tokens.push(result); |
|
|
|
tokstream = tokstream.substr(6); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
default: |
|
|
|
if (isDigit(tokstream[0])) { |
|
|
|
var result = tokenizeNum(tokstream); |
|
|
@ -200,8 +258,10 @@ function tokenize(tokstream) { |
|
|
|
return tokens; |
|
|
|
} |
|
|
|
|
|
|
|
var tokstream = fs.readFileSync("/dev/stdin").toString(); |
|
|
|
module.exports = {tokenize : tokenize}; |
|
|
|
|
|
|
|
console.log(tokenize(tokstream)); |
|
|
|
//var tokstream = fs.readFileSync("/dev/stdin").toString();
|
|
|
|
//console.log(isIdentifier(')'));
|
|
|
|
//console.log(tokenize(tokstream));
|
|
|
|
//tokenize(tokstream);
|
|
|
|
|
|
|
|