JS Parser take 2
by Glutamat
JavaScript
function TokenFactory (type,test,consume) {
return {
type:type,
test: function (c,driver) {
var result = test (c,driver);
if (typeof result === "object") {
return result;
} else if (result) {
var inst = Object.create (this);
inst.first = c;
inst.value = "";
return inst;
}
},
consume: consume
}
}
var whitespaces = TokenFactory (
"whitespaces",
function (c) {
return c <= " ";
},
function (c,driver) {
this.value += c,i=10;
while (i-- && this.test (driver.step ())) {console.warn (driver.src.charAt (driver.char));this.value += "-"};
console.warn (driver.src.charAt (driver.char))
}
);
var strings = TokenFactory (
"string",
function (c) {
return c == "'" || c=='"';
},
function (c,driver) {
var i = 10;
while (i--) {
c = driver.step ();
if (c === this.first) {
break;
}
this.value += c;
}
driver.step ();
}
)
var keywords = ["function","if","else"];
var identifier = TokenFactory (
"name",
function (c) {
return /[_$a-zA-Z]/.test (c)
},
function (c,driver) {
var i = 10;
this.value += c;
while (i--) {
c = driver.step ()
if (!/[_$a-zA-Z0-9]/.test (c)) {
break;
}
this.value += c;
}
if (!!~keywords.indexOf (this.value)) {
this.type = "keyword";
}
}
)
var operatorList = ["/="]
var operators = TokenFactory (
"operator",
function (c,driver) {
var seq = c + driver.peek (1);
console.log (seq);
for (var i=0,o=operatorList;i<o.length; i++) {
if (!!~o [i].indexOf (seq))
return true;
}
...