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;
        }
       ...