You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.3 KiB
82 lines
2.3 KiB
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.Scanner = void 0;
|
|
const Token_1 = require("./Token");
|
|
const ROW_DELIMITER = /((?:\r\n)|\n|\r)/;
|
|
class Scanner {
|
|
constructor(args) {
|
|
this.cursor = 0;
|
|
this.line = args.line;
|
|
this.lineLength = this.line.length;
|
|
this.parserOptions = args.parserOptions;
|
|
this.hasMoreData = args.hasMoreData;
|
|
this.cursor = args.cursor || 0;
|
|
}
|
|
get hasMoreCharacters() {
|
|
return this.lineLength > this.cursor;
|
|
}
|
|
get nextNonSpaceToken() {
|
|
const { lineFromCursor } = this;
|
|
const regex = this.parserOptions.NEXT_TOKEN_REGEXP;
|
|
if (lineFromCursor.search(regex) === -1) {
|
|
return null;
|
|
}
|
|
const match = regex.exec(lineFromCursor);
|
|
if (match == null) {
|
|
return null;
|
|
}
|
|
const token = match[1];
|
|
const startCursor = this.cursor + (match.index || 0);
|
|
return new Token_1.Token({
|
|
token,
|
|
startCursor,
|
|
endCursor: startCursor + token.length - 1,
|
|
});
|
|
}
|
|
get nextCharacterToken() {
|
|
const { cursor, lineLength } = this;
|
|
if (lineLength <= cursor) {
|
|
return null;
|
|
}
|
|
return new Token_1.Token({
|
|
token: this.line[cursor],
|
|
startCursor: cursor,
|
|
endCursor: cursor,
|
|
});
|
|
}
|
|
get lineFromCursor() {
|
|
return this.line.substr(this.cursor);
|
|
}
|
|
advancePastLine() {
|
|
const match = ROW_DELIMITER.exec(this.lineFromCursor);
|
|
if (!match) {
|
|
if (this.hasMoreData) {
|
|
return null;
|
|
}
|
|
this.cursor = this.lineLength;
|
|
return this;
|
|
}
|
|
this.cursor += (match.index || 0) + match[0].length;
|
|
return this;
|
|
}
|
|
advanceTo(cursor) {
|
|
this.cursor = cursor;
|
|
return this;
|
|
}
|
|
advanceToToken(token) {
|
|
this.cursor = token.startCursor;
|
|
return this;
|
|
}
|
|
advancePastToken(token) {
|
|
this.cursor = token.endCursor + 1;
|
|
return this;
|
|
}
|
|
truncateToCursor() {
|
|
this.line = this.lineFromCursor;
|
|
this.lineLength = this.line.length;
|
|
this.cursor = 0;
|
|
return this;
|
|
}
|
|
}
|
|
exports.Scanner = Scanner;
|
|
//# sourceMappingURL=Scanner.js.map
|