Lexer demo
by malikzh
JavaScript
function isNum (c) {
return "0123456789".indexOf(c) >= 0;
}
function isOp(c) {
return c === "+" || c === "-" || c === "*" || c === "(" || c === ")";
}
function lexer(sourceCode) {
let tmp = "";
let tokens = []
let state = "wait"; // Переменная хранит в себе состояние
for (let i=0; i<sourceCode.length;) {
let c = sourceCode.charAt(i);
// Пропускаем пробелы
if (c === ' ' || c ==="\t" || c === "\n" || c === "\r") {
i++;
continue;
}
if (state === 'wait') {
if (isNum(c)) {
state = 'num'
tmp += c;
++i;
continue;
}
if (isOp(c)) {
tokens.push(c);
++i;
continue;
}
} else if (state === 'num') {
if (isNum(c)) {
tmp += c;
++i;
continue;
} else {
if (tmp !== "") {
tokens.push(parseInt(tmp))
tmp = '';
}
state = 'wait';
continue;
}
} else {
return null;
}
}
return tokens;
}
// Для просмотра результата необходимо открыть консоль в браузере (нажать F12 или Ctrl+Shift+C или Esc)
console.log(lexer("10 + 10 * (3 - 1) + -(3-4)"));