jweinst1
12/22/2016 - 6:43 AM

lisp parser that supports double quotes inside strings

lisp parser that supports double quotes inside strings

//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; code[t] = ""; current_token=""}
          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) + "]");
};