UNPKG

antlr4-runtime

Version:

JavaScript runtime for ANTLR4

91 lines (83 loc) 2.96 kB
import Token from "./Token.js"; export default class CommonToken extends Token { constructor(source, type, channel, start, stop) { super(); this.source = source !== undefined ? source : CommonToken.EMPTY_SOURCE; this.type = type !== undefined ? type : null; this.channel = channel !== undefined ? channel : Token.DEFAULT_CHANNEL; this.start = start !== undefined ? start : -1; this.stop = stop !== undefined ? stop : -1; this.tokenIndex = -1; if (this.source[0] !== null) { this.line = source[0].line; this.column = source[0].column; } else { this.column = -1; } } /** * Constructs a new {@link CommonToken} as a copy of another {@link Token}. * * <p> * If {@code oldToken} is also a {@link CommonToken} instance, the newly * constructed token will share a reference to the {@link //text} field and * the {@link Pair} stored in {@link //source}. Otherwise, {@link //text} will * be assigned the result of calling {@link //getText}, and {@link //source} * will be constructed from the result of {@link Token//getTokenSource} and * {@link Token//getInputStream}.</p> * * @param oldToken The token to copy. */ clone() { const t = new CommonToken(this.source, this.type, this.channel, this.start, this.stop); t.tokenIndex = this.tokenIndex; t.line = this.line; t.column = this.column; t.text = this.text; return t; } cloneWithType(type) { const t = new CommonToken(this.source, type, this.channel, this.start, this.stop); t.tokenIndex = this.tokenIndex; t.line = this.line; t.column = this.column; if (type === Token.EOF) t.text = ""; return t; } toString() { let txt = this.text; if (txt !== null) { txt = txt.replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t"); } else { txt = "<no text>"; } return "[@" + this.tokenIndex + "," + this.start + ":" + this.stop + "='" + txt + "',<" + this.type + ">" + (this.channel > 0 ? ",channel=" + this.channel : "") + "," + this.line + ":" + this.column + "]"; } get text(){ if (this._text !== null) { return this._text; } const input = this.getInputStream(); if (input === null) { return null; } const n = input.size; if (this.start < n && this.stop < n) { return input.getText(this.start, this.stop); } else { return "<EOF>"; } } set text(text) { this._text = text; } } /** * An empty {@link Pair} which is used as the default value of * {@link //source} for tokens that do not have a source. */ CommonToken.EMPTY_SOURCE = [ null, null ];