antlr4-runtime
Version:
JavaScript runtime for ANTLR4
91 lines (83 loc) • 2.96 kB
JavaScript
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 ];