Skip to content

Instantly share code, notes, and snippets.

@alexeykomov
Created August 30, 2016 16:15
Show Gist options
  • Save alexeykomov/ba166096680df20841dc231a25c580dd to your computer and use it in GitHub Desktop.
Save alexeykomov/ba166096680df20841dc231a25c580dd to your computer and use it in GitHub Desktop.
const Token = {
NUMBER: 1,
LEFT_PAREN: 2,
RIGHT_PAREN: 3,
PLUS: 4,
MINUS: 5,
DIVIDE: 6,
MULTIPLY: 7
}
function createToken(aType, aValue) {
return {
type: aType,
value: aValue
}
}
let index = -1;
function getNextChar(aString) {
if (index + 1 < aString.length) {
return aString.charAt(++index);
}
else {
return '';
}
}
function peekNextChar(aString) {
if (index + 1 < aString.length) {
return aString.charAt(index + 1);
}
else {
return '';
}
}
function eatUpSpaces(aString) {
while (/\s/.test(peekNextChar(aString))) {
getNextChar(aString);
}
}
function scanForNumber(aString) {
const buff = [];
while (/\d/.test(peekNextChar(aString))) {
buff.push(getNextChar(aString));
}
if (buff.length) {
return createToken(Token.NUMBER, parseInt(buff.join(''), 10));
} else {
return null;
}
}
function scanForOperator(aString) {
switch (peekNextChar(aString)) {
case '+': return createToken(Token.PLUS, getNextChar(aString));
case '-': return createToken(Token.MINUS, getNextChar(aString));
case '/': return createToken(Token.DIVIDE, getNextChar(aString));
case '*': return createToken(Token.MULTIPLY, getNextChar(aString));
default: return null;
}
}
function scanForParen(aString) {
switch (peekNextChar(aString)) {
case '(': return createToken(Token.LEFT_PAREN, getNextChar(aString));
case ')': return createToken(Token.RIGHT_PAREN, getNextChar(aString));
default: return null;
}
}
function tokenize(aString) {
const tokens = [];
while (index < aString.length) {
let nextToken;
eatUpSpaces(aString);
nextToken = scanForParen(aString);
nextToken = scanForOperator(aString);
nextToken = scanForNumber(aString);
console.log('nextToken: ', nextToken);
if (nextToken) {
tokens.push(nextToken)
} else {
throw new Error('Syntax error: unrecognized token at char: ' + peekNextChar(aString));
}
}
return tokens;
}
console.log(tokenize('((2 + 2) / 4) * 2'));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment