UNPKG

antlr-ng

Version:

Next generation ANTLR Tool

59 lines (58 loc) 1.57 kB
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 };