jweinst1
12/22/2016 - 1:05 AM

bench mark testing for lisp parsing.

bench mark testing for lisp parsing.

//Parser Tokenizer for lisp dialects
//creates deep list with JSON parser


var ParseLisp = function(code){
  //Tokenizing Section
  if(code[0] !== "(" || code[code.length-1] !== ")" ) throw "Paren Error";
  /*States 0=null
           1=tokenize
           2=string*/
  var current_token = "";
  var sepTokens = {" ":true, "\n":true, "\t":true};
  var tokens = [];
  var state = 0;
  for(var t=0;t<code.length;t++){
    switch(state){
      case 0:
        if(code[t] === "(" || code[t] === ")") tokens.push(code[t]);
        else if(!(code[t] in sepTokens)) {
          current_token = code[t];
          if(code[t] === '"') state = 2;
          else state = 1;
        }
        break;
      case 1:
        if(code[t] === "(" || code[t] === ")") {
          tokens.push(current_token);
          current_token = "";
          tokens.push(code[t]);
          state = 0;
        }
        else if (code[t] in sepTokens) {
          tokens.push(current_token);
          current_token = "";
          state = 0; 
        }
        else {
          current_token += code[t];
        }
        break;
      case 2:
        if(code[t] === '"') {
          tokens.push(current_token + code[t]);
          current_token = "";
          state = 0;
        }
        else {
          current_token += code[t];
        }
        break;
    }
  }
  //Parsing Section
  for(var i=0;i<tokens.length;i++){
    switch(tokens[i]){
        case "(":
         tokens[i] = "[";
         break;
        case ")":
          if(tokens[i+1] !== ")") tokens[i] = "],";
          else tokens[i] = "]";
          break;
        default:
          if(tokens[i+1] === ")") tokens[i] = '"' + tokens[i] + '"';
          else tokens[i] = '"' + tokens[i] + '",';
      }
    } 
  return JSON.parse( "[" + tokens.join("").slice(0, -1) + "]");
};


var string = "";
for(var i=0;i<10000;i++) string += "(add 4 5 (- 4 3) (* 3 4 5))";
console.time("foo");
ParseLisp(string);
console.timeEnd("foo");
//67 ms