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