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