Created
May 14, 2017 15:46
-
-
Save shalvah/2a4c6e34353c26f8ab6d26fcd2bcca8f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function Token(type, value) { | |
this.type = type; | |
this.value = value; | |
} | |
function isComma(ch) { | |
return /,/.test(ch); | |
} | |
function isDigit(ch) { | |
return /\d/.test(ch); | |
} | |
function isLetter(ch) { | |
return /[a-z]/i.test(ch); | |
} | |
function isOperator(ch) { | |
return /\+|-|\*|\/|\^/.test(ch); | |
} | |
function isLeftParenthesis(ch) { | |
return /\(/.test(ch); | |
} | |
function isRightParenthesis(ch) { | |
return /\)/.test(ch); | |
} | |
function tokenize(str) { | |
str.replace(/\s+/g, ""); | |
str=str.split(""); | |
var result=[]; | |
var letterBuffer=[]; | |
var numberBuffer=[]; | |
str.forEach(function (char, idx) { | |
if(isDigit(char)) { | |
numberBuffer.push(char); | |
} else if(char==".") { | |
numberBuffer.push(char); | |
} else if (isLetter(char)) { | |
if(numberBuffer.length) { | |
emptyNumberBufferAsLiteral(); | |
result.push(new Token("Operator", "*")); | |
} | |
letterBuffer.push(char); | |
} else if (isOperator(char)) { | |
emptyNumberBufferAsLiteral(); | |
emptyLetterBufferAsVariables(); | |
result.push(new Token("Operator", char)); | |
} else if (isLeftParenthesis(char)) { | |
if(letterBuffer.length) { | |
result.push(new Token("Function", letterBuffer.join(""))); | |
letterBuffer=[]; | |
} else if(numberBuffer.length) { | |
emptyNumberBufferAsLiteral(); | |
result.push(new Token("Operator", "*")); | |
} | |
result.push(new Token("Left Parenthesis", char)); | |
} else if (isRightParenthesis(char)) { | |
emptyLetterBufferAsVariables(); | |
emptyNumberBufferAsLiteral(); | |
result.push(new Token("Right Parenthesis", char)); | |
} else if (isComma(char)) { | |
emptyNumberBufferAsLiteral(); | |
emptyLetterBufferAsVariables(); | |
result.push(new Token("Function Argument Separator", char)); | |
} | |
}); | |
if (numberBuffer.length) { | |
emptyNumberBufferAsLiteral(); | |
} | |
if(letterBuffer.length) { | |
emptyLetterBufferAsVariables(); | |
} | |
return result; | |
function emptyLetterBufferAsVariables() { | |
var l = letterBuffer.length; | |
for (var i = 0; i < l; i++) { | |
result.push(new Token("Variable", letterBuffer[i])); | |
if(i< l-1) { //there are more Variables left | |
result.push(new Token("Operator", "*")); | |
} | |
} | |
letterBuffer = []; | |
} | |
function emptyNumberBufferAsLiteral() { | |
if(numberBuffer.length) { | |
result.push(new Token("Literal", numberBuffer.join(""))); | |
numberBuffer=[]; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The indentation from ll84 is a bit confusing.