Utility methods on the lexer
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
goog.provide('ol.expression.Lexer');
|
goog.provide('ol.expression.Lexer');
|
||||||
|
goog.provide('ol.expression.Token');
|
||||||
goog.provide('ol.expression.TokenType');
|
goog.provide('ol.expression.TokenType');
|
||||||
|
|
||||||
goog.require('goog.asserts');
|
goog.require('goog.asserts');
|
||||||
@@ -106,6 +107,27 @@ ol.expression.Lexer = function(source) {
|
|||||||
*/
|
*/
|
||||||
this.index_ = 0;
|
this.index_ = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Next character index (only set after `peek`ing).
|
||||||
|
* @type {number}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
this.nextIndex_ = 0;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scan the next token and throw if it doesn't match.
|
||||||
|
* @param {string} value Token value.
|
||||||
|
*/
|
||||||
|
ol.expression.Lexer.prototype.expect = function(value) {
|
||||||
|
var match = this.match(value);
|
||||||
|
this.skip();
|
||||||
|
if (!match) {
|
||||||
|
throw new Error('Unexpected token at index ' + this.index_ +
|
||||||
|
': ' + this.getCurrentChar_());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -324,6 +346,19 @@ ol.expression.Lexer.prototype.getCurrentCharCode_ = function() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether the upcoming token matches the given punctuator.
|
||||||
|
* @param {string} value Punctuator value.
|
||||||
|
* @return {boolean} The token matches.
|
||||||
|
*/
|
||||||
|
ol.expression.Lexer.prototype.match = function(value) {
|
||||||
|
var token = this.peek();
|
||||||
|
return (
|
||||||
|
token.type === ol.expression.TokenType.PUNCTUATOR &&
|
||||||
|
token.value === value);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scan the next token.
|
* Scan the next token.
|
||||||
*
|
*
|
||||||
@@ -768,6 +803,15 @@ ol.expression.Lexer.prototype.skipWhitespace_ = function() {
|
|||||||
ol.expression.Lexer.prototype.peek = function() {
|
ol.expression.Lexer.prototype.peek = function() {
|
||||||
var currentIndex = this.index_;
|
var currentIndex = this.index_;
|
||||||
var token = this.next();
|
var token = this.next();
|
||||||
|
this.nextIndex_ = this.index_;
|
||||||
this.index_ = currentIndex;
|
this.index_ = currentIndex;
|
||||||
return token;
|
return token;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* After peeking, skip may be called to advance the cursor without re-scanning.
|
||||||
|
*/
|
||||||
|
ol.expression.Lexer.prototype.skip = function() {
|
||||||
|
this.index_ = this.nextIndex_;
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user