antlr-ng
Version:
Next generation ANTLR Tool
59 lines (58 loc) • 1.57 kB
JavaScript
var __defProp = Object.defineProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
import {
ATNState,
BlockEndState,
EpsilonTransition,
PlusLoopbackState,
RuleTransition,
StarLoopbackState
} from "antlr4ng";
class TailEpsilonRemover {
constructor(atn) {
this.atn = atn;
}
static {
__name(this, "TailEpsilonRemover");
}
visit(s) {
this.doVisit(s, /* @__PURE__ */ new Set());
}
visitState(p) {
if (p.constructor.stateType === ATNState.BASIC && p.transitions.length === 1) {
const transition = p.transitions[0];
let q = transition.target;
if (transition instanceof RuleTransition) {
q = transition.followState;
}
if (q.constructor.stateType === ATNState.BASIC) {
const trans = q.transitions[0];
if (q.transitions.length === 1 && trans instanceof EpsilonTransition) {
const r = trans.target;
if (r instanceof BlockEndState || r instanceof PlusLoopbackState || r instanceof StarLoopbackState) {
const t = p.transitions[0];
if (t instanceof RuleTransition) {
t.followState = r;
} else {
t.target = r;
}
this.atn.removeState(q);
}
}
}
}
}
doVisit(s, visited) {
if (visited.has(s.stateNumber)) {
return;
}
visited.add(s.stateNumber);
this.visitState(s);
for (const t of s.transitions) {
this.doVisit(t.target, visited);
}
}
}
export {
TailEpsilonRemover
};