falcor-path-syntax
Version:
Parser for Falcor Path Syntax
83 lines (65 loc) • 2.24 kB
JavaScript
var TokenTypes = require('./../TokenTypes');
var E = require('./../exceptions');
var quoteE = E.quote;
/**
* quote is all the parse tree in between quotes. This includes the only
* escaping logic.
*
* parse-tree:
* <opening-quote>(.|(<escape><opening-quote>))*<opening-quote>
*/
module.exports = function quote(tokenizer, openingToken, state, out) {
var token = tokenizer.next();
var innerToken = '';
var openingQuote = openingToken.token;
var escaping = false;
var done = false;
while (!token.done) {
switch (token.type) {
case TokenTypes.token:
case TokenTypes.space:
case TokenTypes.dotSeparator:
case TokenTypes.commaSeparator:
case TokenTypes.openingBracket:
case TokenTypes.closingBracket:
case TokenTypes.openingBrace:
case TokenTypes.closingBrace:
if (escaping) {
E.throwError(quoteE.illegalEscape, tokenizer);
}
innerToken += token.token;
break;
case TokenTypes.quote:
// the simple case. We are escaping
if (escaping) {
innerToken += token.token;
escaping = false;
}
// its not a quote that is the opening quote
else if (token.token !== openingQuote) {
innerToken += token.token;
}
// last thing left. Its a quote that is the opening quote
// therefore we must produce the inner token of the indexer.
else {
done = true;
}
break;
case TokenTypes.escape:
escaping = true;
break;
default:
E.throwError(E.unexpectedToken, tokenizer);
}
// If done, leave loop
if (done) {
break;
}
// Keep cycling through the tokenizer.
token = tokenizer.next();
}
if (innerToken.length === 0) {
E.throwError(quoteE.empty, tokenizer);
}
state.indexer[state.indexer.length] = innerToken;
};