falcor-path-syntax
Version:
Parser for Falcor Path Syntax
60 lines (47 loc) • 1.61 kB
JavaScript
var TokenTypes = require('./../TokenTypes');
var E = require('./../exceptions');
var indexer = require('./indexer');
/**
* The top level of the parse tree. This returns the generated path
* from the tokenizer.
*/
module.exports = function head(tokenizer) {
var token = tokenizer.next();
var state = {};
var out = [];
while (!token.done) {
switch (token.type) {
case TokenTypes.token:
var first = +token.token[0];
if (!isNaN(first)) {
E.throwError(E.invalidIdentifier, tokenizer);
}
out[out.length] = token.token;
break;
// dotSeparators at the top level have no meaning
case TokenTypes.dotSeparator:
if (out.length === 0) {
E.throwError(E.unexpectedToken, tokenizer);
}
break;
// Spaces do nothing.
case TokenTypes.space:
// NOTE: Spaces at the top level are allowed.
// titlesById .summary is a valid path.
break;
// Its time to decend the parse tree.
case TokenTypes.openingBracket:
indexer(tokenizer, token, state, out);
break;
default:
E.throwError(E.unexpectedToken, tokenizer);
break;
}
// Keep cycling through the tokenizer.
token = tokenizer.next();
}
if (out.length === 0) {
E.throwError(E.invalidPath, tokenizer);
}
return out;
};