code: function commaSeparated (fn, inp, cb) {
      var all = [], res;
      while (1) {
        res = fn(inp);
        if ((res && !cb) || (res && cb(res, inp))) {
          all.push(res);
          if (inp.skipWs().takeAPeek(",")) {
            inp.skipWs();
          } else break;
        } else break;
      }
      return all;
    }
docs: Matches a comma separated list of tokens. Can take a callback to validate the input on each iteration. Note: this always returns a list. The calling function should determine if an empty list is a syntax error or not.