UNPKG

antlr4ts

Version:

ANTLR 4 runtime for JavaScript written in Typescript

999 lines 53.6 kB
"use strict"; /*! * Copyright 2016 The ANTLR Project. All rights reserved. * Licensed under the BSD-3-Clause license. See LICENSE file in the project root for license information. */ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ATNDeserializer = void 0; // ConvertTo-TS run at 2016-10-04T11:26:25.9683447-07:00 const ActionTransition_1 = require("./ActionTransition"); const Array2DHashSet_1 = require("../misc/Array2DHashSet"); const ATN_1 = require("./ATN"); const ATNDeserializationOptions_1 = require("./ATNDeserializationOptions"); const ATNStateType_1 = require("./ATNStateType"); const AtomTransition_1 = require("./AtomTransition"); const BasicBlockStartState_1 = require("./BasicBlockStartState"); const BasicState_1 = require("./BasicState"); const BitSet_1 = require("../misc/BitSet"); const BlockEndState_1 = require("./BlockEndState"); const BlockStartState_1 = require("./BlockStartState"); const DecisionState_1 = require("./DecisionState"); const DFA_1 = require("../dfa/DFA"); const EpsilonTransition_1 = require("./EpsilonTransition"); const IntervalSet_1 = require("../misc/IntervalSet"); const InvalidState_1 = require("./InvalidState"); const LexerChannelAction_1 = require("./LexerChannelAction"); const LexerCustomAction_1 = require("./LexerCustomAction"); const LexerModeAction_1 = require("./LexerModeAction"); const LexerMoreAction_1 = require("./LexerMoreAction"); const LexerPopModeAction_1 = require("./LexerPopModeAction"); const LexerPushModeAction_1 = require("./LexerPushModeAction"); const LexerSkipAction_1 = require("./LexerSkipAction"); const LexerTypeAction_1 = require("./LexerTypeAction"); const LoopEndState_1 = require("./LoopEndState"); const Decorators_1 = require("../Decorators"); const NotSetTransition_1 = require("./NotSetTransition"); const ParserATNSimulator_1 = require("./ParserATNSimulator"); const PlusBlockStartState_1 = require("./PlusBlockStartState"); const PlusLoopbackState_1 = require("./PlusLoopbackState"); const PrecedencePredicateTransition_1 = require("./PrecedencePredicateTransition"); const PredicateTransition_1 = require("./PredicateTransition"); const RangeTransition_1 = require("./RangeTransition"); const RuleStartState_1 = require("./RuleStartState"); const RuleStopState_1 = require("./RuleStopState"); const RuleTransition_1 = require("./RuleTransition"); const SetTransition_1 = require("./SetTransition"); const StarBlockStartState_1 = require("./StarBlockStartState"); const StarLoopbackState_1 = require("./StarLoopbackState"); const StarLoopEntryState_1 = require("./StarLoopEntryState"); const Token_1 = require("../Token"); const TokensStartState_1 = require("./TokensStartState"); const UUID_1 = require("../misc/UUID"); const WildcardTransition_1 = require("./WildcardTransition"); var UnicodeDeserializingMode; (function (UnicodeDeserializingMode) { UnicodeDeserializingMode[UnicodeDeserializingMode["UNICODE_BMP"] = 0] = "UNICODE_BMP"; UnicodeDeserializingMode[UnicodeDeserializingMode["UNICODE_SMP"] = 1] = "UNICODE_SMP"; })(UnicodeDeserializingMode || (UnicodeDeserializingMode = {})); /** * * @author Sam Harwell */ class ATNDeserializer { constructor(deserializationOptions) { if (deserializationOptions === undefined) { deserializationOptions = ATNDeserializationOptions_1.ATNDeserializationOptions.defaultOptions; } this.deserializationOptions = deserializationOptions; } static get SERIALIZED_VERSION() { /* This value should never change. Updates following this version are * reflected as change in the unique ID SERIALIZED_UUID. */ return 3; } /** * Determines if a particular serialized representation of an ATN supports * a particular feature, identified by the {@link UUID} used for serializing * the ATN at the time the feature was first introduced. * * @param feature The {@link UUID} marking the first time the feature was * supported in the serialized ATN. * @param actualUuid The {@link UUID} of the actual serialized ATN which is * currently being deserialized. * @returns `true` if the `actualUuid` value represents a * serialized ATN at or after the feature identified by `feature` was * introduced; otherwise, `false`. */ static isFeatureSupported(feature, actualUuid) { let featureIndex = ATNDeserializer.SUPPORTED_UUIDS.findIndex((e) => e.equals(feature)); if (featureIndex < 0) { return false; } return ATNDeserializer.SUPPORTED_UUIDS.findIndex((e) => e.equals(actualUuid)) >= featureIndex; } static getUnicodeDeserializer(mode) { if (mode === 0 /* UNICODE_BMP */) { return { readUnicode: (data, p) => { return ATNDeserializer.toInt(data[p]); }, size: 1, }; } else { return { readUnicode: (data, p) => { return ATNDeserializer.toInt32(data, p); }, size: 2, }; } } deserialize(data) { data = data.slice(0); // Each Uint16 value in data is shifted by +2 at the entry to this method. This is an encoding optimization // targeting the serialized values 0 and -1 (serialized to 0xFFFF), each of which are very common in the // serialized form of the ATN. In the modified UTF-8 that Java uses for compiled string literals, these two // character values have multi-byte forms. By shifting each value by +2, they become characters 2 and 1 prior to // writing the string, each of which have single-byte representations. Since the shift occurs in the tool during // ATN serialization, each target is responsible for adjusting the values during deserialization. // // As a special case, note that the first element of data is not adjusted because it contains the major version // number of the serialized ATN, which was fixed at 3 at the time the value shifting was implemented. for (let i = 1; i < data.length; i++) { data[i] = (data[i] - 2) & 0xFFFF; } let p = 0; let version = ATNDeserializer.toInt(data[p++]); if (version !== ATNDeserializer.SERIALIZED_VERSION) { let reason = `Could not deserialize ATN with version ${version} (expected ${ATNDeserializer.SERIALIZED_VERSION}).`; throw new Error(reason); } let uuid = ATNDeserializer.toUUID(data, p); p += 8; if (ATNDeserializer.SUPPORTED_UUIDS.findIndex((e) => e.equals(uuid)) < 0) { let reason = `Could not deserialize ATN with UUID ${uuid} (expected ${ATNDeserializer.SERIALIZED_UUID} or a legacy UUID).`; throw new Error(reason); } let supportsLexerActions = ATNDeserializer.isFeatureSupported(ATNDeserializer.ADDED_LEXER_ACTIONS, uuid); let grammarType = ATNDeserializer.toInt(data[p++]); let maxTokenType = ATNDeserializer.toInt(data[p++]); let atn = new ATN_1.ATN(grammarType, maxTokenType); // // STATES // let loopBackStateNumbers = []; let endStateNumbers = []; let nstates = ATNDeserializer.toInt(data[p++]); for (let i = 0; i < nstates; i++) { let stype = ATNDeserializer.toInt(data[p++]); // ignore bad type of states if (stype === ATNStateType_1.ATNStateType.INVALID_TYPE) { atn.addState(new InvalidState_1.InvalidState()); continue; } let ruleIndex = ATNDeserializer.toInt(data[p++]); if (ruleIndex === 0xFFFF) { ruleIndex = -1; } let s = this.stateFactory(stype, ruleIndex); if (stype === ATNStateType_1.ATNStateType.LOOP_END) { // special case let loopBackStateNumber = ATNDeserializer.toInt(data[p++]); loopBackStateNumbers.push([s, loopBackStateNumber]); } else if (s instanceof BlockStartState_1.BlockStartState) { let endStateNumber = ATNDeserializer.toInt(data[p++]); endStateNumbers.push([s, endStateNumber]); } atn.addState(s); } // delay the assignment of loop back and end states until we know all the state instances have been initialized for (let pair of loopBackStateNumbers) { pair[0].loopBackState = atn.states[pair[1]]; } for (let pair of endStateNumbers) { pair[0].endState = atn.states[pair[1]]; } let numNonGreedyStates = ATNDeserializer.toInt(data[p++]); for (let i = 0; i < numNonGreedyStates; i++) { let stateNumber = ATNDeserializer.toInt(data[p++]); atn.states[stateNumber].nonGreedy = true; } let numSllDecisions = ATNDeserializer.toInt(data[p++]); for (let i = 0; i < numSllDecisions; i++) { let stateNumber = ATNDeserializer.toInt(data[p++]); atn.states[stateNumber].sll = true; } let numPrecedenceStates = ATNDeserializer.toInt(data[p++]); for (let i = 0; i < numPrecedenceStates; i++) { let stateNumber = ATNDeserializer.toInt(data[p++]); atn.states[stateNumber].isPrecedenceRule = true; } // // RULES // let nrules = ATNDeserializer.toInt(data[p++]); if (atn.grammarType === 0 /* LEXER */) { atn.ruleToTokenType = new Int32Array(nrules); } atn.ruleToStartState = new Array(nrules); for (let i = 0; i < nrules; i++) { let s = ATNDeserializer.toInt(data[p++]); let startState = atn.states[s]; startState.leftFactored = ATNDeserializer.toInt(data[p++]) !== 0; atn.ruleToStartState[i] = startState; if (atn.grammarType === 0 /* LEXER */) { let tokenType = ATNDeserializer.toInt(data[p++]); if (tokenType === 0xFFFF) { tokenType = Token_1.Token.EOF; } atn.ruleToTokenType[i] = tokenType; if (!ATNDeserializer.isFeatureSupported(ATNDeserializer.ADDED_LEXER_ACTIONS, uuid)) { // this piece of unused metadata was serialized prior to the // addition of LexerAction let actionIndexIgnored = ATNDeserializer.toInt(data[p++]); if (actionIndexIgnored === 0xFFFF) { actionIndexIgnored = -1; } } } } atn.ruleToStopState = new Array(nrules); for (let state of atn.states) { if (!(state instanceof RuleStopState_1.RuleStopState)) { continue; } atn.ruleToStopState[state.ruleIndex] = state; atn.ruleToStartState[state.ruleIndex].stopState = state; } // // MODES // let nmodes = ATNDeserializer.toInt(data[p++]); for (let i = 0; i < nmodes; i++) { let s = ATNDeserializer.toInt(data[p++]); atn.modeToStartState.push(atn.states[s]); } atn.modeToDFA = new Array(nmodes); for (let i = 0; i < nmodes; i++) { atn.modeToDFA[i] = new DFA_1.DFA(atn.modeToStartState[i]); } // // SETS // let sets = []; // First, read all sets with 16-bit Unicode code points <= U+FFFF. p = this.deserializeSets(data, p, sets, ATNDeserializer.getUnicodeDeserializer(0 /* UNICODE_BMP */)); // Next, if the ATN was serialized with the Unicode SMP feature, // deserialize sets with 32-bit arguments <= U+10FFFF. if (ATNDeserializer.isFeatureSupported(ATNDeserializer.ADDED_UNICODE_SMP, uuid)) { p = this.deserializeSets(data, p, sets, ATNDeserializer.getUnicodeDeserializer(1 /* UNICODE_SMP */)); } // // EDGES // let nedges = ATNDeserializer.toInt(data[p++]); for (let i = 0; i < nedges; i++) { let src = ATNDeserializer.toInt(data[p]); let trg = ATNDeserializer.toInt(data[p + 1]); let ttype = ATNDeserializer.toInt(data[p + 2]); let arg1 = ATNDeserializer.toInt(data[p + 3]); let arg2 = ATNDeserializer.toInt(data[p + 4]); let arg3 = ATNDeserializer.toInt(data[p + 5]); let trans = this.edgeFactory(atn, ttype, src, trg, arg1, arg2, arg3, sets); // console.log(`EDGE ${trans.constructor.name} ${src}->${trg} ${Transition.serializationNames[ttype]} ${arg1},${arg2},${arg3}`); let srcState = atn.states[src]; srcState.addTransition(trans); p += 6; } let returnTransitionsSet = new Array2DHashSet_1.Array2DHashSet({ hashCode: (o) => o.stopState ^ o.returnState ^ o.outermostPrecedenceReturn, equals: (a, b) => { return a.stopState === b.stopState && a.returnState === b.returnState && a.outermostPrecedenceReturn === b.outermostPrecedenceReturn; }, }); let returnTransitions = []; for (let state of atn.states) { let returningToLeftFactored = state.ruleIndex >= 0 && atn.ruleToStartState[state.ruleIndex].leftFactored; for (let i = 0; i < state.numberOfTransitions; i++) { let t = state.transition(i); if (!(t instanceof RuleTransition_1.RuleTransition)) { continue; } let ruleTransition = t; let returningFromLeftFactored = atn.ruleToStartState[ruleTransition.target.ruleIndex].leftFactored; if (!returningFromLeftFactored && returningToLeftFactored) { continue; } let outermostPrecedenceReturn = -1; if (atn.ruleToStartState[ruleTransition.target.ruleIndex].isPrecedenceRule) { if (ruleTransition.precedence === 0) { outermostPrecedenceReturn = ruleTransition.target.ruleIndex; } } let current = { stopState: ruleTransition.target.ruleIndex, returnState: ruleTransition.followState.stateNumber, outermostPrecedenceReturn }; if (returnTransitionsSet.add(current)) { returnTransitions.push(current); } } } // Add all elements from returnTransitions to the ATN for (let returnTransition of returnTransitions) { let transition = new EpsilonTransition_1.EpsilonTransition(atn.states[returnTransition.returnState], returnTransition.outermostPrecedenceReturn); atn.ruleToStopState[returnTransition.stopState].addTransition(transition); } for (let state of atn.states) { if (state instanceof BlockStartState_1.BlockStartState) { // we need to know the end state to set its start state if (state.endState === undefined) { throw new Error("IllegalStateException"); } // block end states can only be associated to a single block start state if (state.endState.startState !== undefined) { throw new Error("IllegalStateException"); } state.endState.startState = state; } if (state instanceof PlusLoopbackState_1.PlusLoopbackState) { let loopbackState = state; for (let i = 0; i < loopbackState.numberOfTransitions; i++) { let target = loopbackState.transition(i).target; if (target instanceof PlusBlockStartState_1.PlusBlockStartState) { target.loopBackState = loopbackState; } } } else if (state instanceof StarLoopbackState_1.StarLoopbackState) { let loopbackState = state; for (let i = 0; i < loopbackState.numberOfTransitions; i++) { let target = loopbackState.transition(i).target; if (target instanceof StarLoopEntryState_1.StarLoopEntryState) { target.loopBackState = loopbackState; } } } } // // DECISIONS // let ndecisions = ATNDeserializer.toInt(data[p++]); for (let i = 1; i <= ndecisions; i++) { let s = ATNDeserializer.toInt(data[p++]); let decState = atn.states[s]; atn.decisionToState.push(decState); decState.decision = i - 1; } // // LEXER ACTIONS // if (atn.grammarType === 0 /* LEXER */) { if (supportsLexerActions) { atn.lexerActions = new Array(ATNDeserializer.toInt(data[p++])); for (let i = 0; i < atn.lexerActions.length; i++) { let actionType = ATNDeserializer.toInt(data[p++]); let data1 = ATNDeserializer.toInt(data[p++]); if (data1 === 0xFFFF) { data1 = -1; } let data2 = ATNDeserializer.toInt(data[p++]); if (data2 === 0xFFFF) { data2 = -1; } let lexerAction = this.lexerActionFactory(actionType, data1, data2); atn.lexerActions[i] = lexerAction; } } else { // for compatibility with older serialized ATNs, convert the old // serialized action index for action transitions to the new // form, which is the index of a LexerCustomAction let legacyLexerActions = []; for (let state of atn.states) { for (let i = 0; i < state.numberOfTransitions; i++) { let transition = state.transition(i); if (!(transition instanceof ActionTransition_1.ActionTransition)) { continue; } let ruleIndex = transition.ruleIndex; let actionIndex = transition.actionIndex; let lexerAction = new LexerCustomAction_1.LexerCustomAction(ruleIndex, actionIndex); state.setTransition(i, new ActionTransition_1.ActionTransition(transition.target, ruleIndex, legacyLexerActions.length, false)); legacyLexerActions.push(lexerAction); } } atn.lexerActions = legacyLexerActions; } } this.markPrecedenceDecisions(atn); atn.decisionToDFA = new Array(ndecisions); for (let i = 0; i < ndecisions; i++) { atn.decisionToDFA[i] = new DFA_1.DFA(atn.decisionToState[i], i); } if (this.deserializationOptions.isVerifyATN) { this.verifyATN(atn); } if (this.deserializationOptions.isGenerateRuleBypassTransitions && atn.grammarType === 1 /* PARSER */) { atn.ruleToTokenType = new Int32Array(atn.ruleToStartState.length); for (let i = 0; i < atn.ruleToStartState.length; i++) { atn.ruleToTokenType[i] = atn.maxTokenType + i + 1; } for (let i = 0; i < atn.ruleToStartState.length; i++) { let bypassStart = new BasicBlockStartState_1.BasicBlockStartState(); bypassStart.ruleIndex = i; atn.addState(bypassStart); let bypassStop = new BlockEndState_1.BlockEndState(); bypassStop.ruleIndex = i; atn.addState(bypassStop); bypassStart.endState = bypassStop; atn.defineDecisionState(bypassStart); bypassStop.startState = bypassStart; let endState; let excludeTransition; if (atn.ruleToStartState[i].isPrecedenceRule) { // wrap from the beginning of the rule to the StarLoopEntryState endState = undefined; for (let state of atn.states) { if (state.ruleIndex !== i) { continue; } if (!(state instanceof StarLoopEntryState_1.StarLoopEntryState)) { continue; } let maybeLoopEndState = state.transition(state.numberOfTransitions - 1).target; if (!(maybeLoopEndState instanceof LoopEndState_1.LoopEndState)) { continue; } if (maybeLoopEndState.epsilonOnlyTransitions && maybeLoopEndState.transition(0).target instanceof RuleStopState_1.RuleStopState) { endState = state; break; } } if (!endState) { throw new Error("Couldn't identify final state of the precedence rule prefix section."); } excludeTransition = endState.loopBackState.transition(0); } else { endState = atn.ruleToStopState[i]; } // all non-excluded transitions that currently target end state need to target blockEnd instead for (let state of atn.states) { for (let i = 0; i < state.numberOfTransitions; i++) { let transition = state.transition(i); if (transition === excludeTransition) { continue; } if (transition.target === endState) { transition.target = bypassStop; } } } // all transitions leaving the rule start state need to leave blockStart instead while (atn.ruleToStartState[i].numberOfTransitions > 0) { let transition = atn.ruleToStartState[i].removeTransition(atn.ruleToStartState[i].numberOfTransitions - 1); bypassStart.addTransition(transition); } // link the new states atn.ruleToStartState[i].addTransition(new EpsilonTransition_1.EpsilonTransition(bypassStart)); bypassStop.addTransition(new EpsilonTransition_1.EpsilonTransition(endState)); let matchState = new BasicState_1.BasicState(); atn.addState(matchState); matchState.addTransition(new AtomTransition_1.AtomTransition(bypassStop, atn.ruleToTokenType[i])); bypassStart.addTransition(new EpsilonTransition_1.EpsilonTransition(matchState)); } if (this.deserializationOptions.isVerifyATN) { // reverify after modification this.verifyATN(atn); } } if (this.deserializationOptions.isOptimize) { while (true) { let optimizationCount = 0; optimizationCount += ATNDeserializer.inlineSetRules(atn); optimizationCount += ATNDeserializer.combineChainedEpsilons(atn); let preserveOrder = atn.grammarType === 0 /* LEXER */; optimizationCount += ATNDeserializer.optimizeSets(atn, preserveOrder); if (optimizationCount === 0) { break; } } if (this.deserializationOptions.isVerifyATN) { // reverify after modification this.verifyATN(atn); } } ATNDeserializer.identifyTailCalls(atn); return atn; } deserializeSets(data, p, sets, unicodeDeserializer) { let nsets = ATNDeserializer.toInt(data[p++]); for (let i = 0; i < nsets; i++) { let nintervals = ATNDeserializer.toInt(data[p]); p++; let set = new IntervalSet_1.IntervalSet(); sets.push(set); let containsEof = ATNDeserializer.toInt(data[p++]) !== 0; if (containsEof) { set.add(-1); } for (let j = 0; j < nintervals; j++) { let a = unicodeDeserializer.readUnicode(data, p); p += unicodeDeserializer.size; let b = unicodeDeserializer.readUnicode(data, p); p += unicodeDeserializer.size; set.add(a, b); } } return p; } /** * Analyze the {@link StarLoopEntryState} states in the specified ATN to set * the {@link StarLoopEntryState#precedenceRuleDecision} field to the * correct value. * * @param atn The ATN. */ markPrecedenceDecisions(atn) { // Map rule index -> precedence decision for that rule let rulePrecedenceDecisions = new Map(); for (let state of atn.states) { if (!(state instanceof StarLoopEntryState_1.StarLoopEntryState)) { continue; } /* We analyze the ATN to determine if this ATN decision state is the * decision for the closure block that determines whether a * precedence rule should continue or complete. */ if (atn.ruleToStartState[state.ruleIndex].isPrecedenceRule) { let maybeLoopEndState = state.transition(state.numberOfTransitions - 1).target; if (maybeLoopEndState instanceof LoopEndState_1.LoopEndState) { if (maybeLoopEndState.epsilonOnlyTransitions && maybeLoopEndState.transition(0).target instanceof RuleStopState_1.RuleStopState) { rulePrecedenceDecisions.set(state.ruleIndex, state); state.precedenceRuleDecision = true; state.precedenceLoopbackStates = new BitSet_1.BitSet(atn.states.length); } } } } // After marking precedence decisions, we go back through and fill in // StarLoopEntryState.precedenceLoopbackStates. for (let precedenceDecision of rulePrecedenceDecisions) { for (let transition of atn.ruleToStopState[precedenceDecision[0]].getTransitions()) { if (transition.serializationType !== 1 /* EPSILON */) { continue; } let epsilonTransition = transition; if (epsilonTransition.outermostPrecedenceReturn !== -1) { continue; } precedenceDecision[1].precedenceLoopbackStates.set(transition.target.stateNumber); } } } verifyATN(atn) { // verify assumptions for (let state of atn.states) { this.checkCondition(state !== undefined, "ATN states should not be undefined."); if (state.stateType === ATNStateType_1.ATNStateType.INVALID_TYPE) { continue; } this.checkCondition(state.onlyHasEpsilonTransitions || state.numberOfTransitions <= 1); if (state instanceof PlusBlockStartState_1.PlusBlockStartState) { this.checkCondition(state.loopBackState !== undefined); } if (state instanceof StarLoopEntryState_1.StarLoopEntryState) { let starLoopEntryState = state; this.checkCondition(starLoopEntryState.loopBackState !== undefined); this.checkCondition(starLoopEntryState.numberOfTransitions === 2); if (starLoopEntryState.transition(0).target instanceof StarBlockStartState_1.StarBlockStartState) { this.checkCondition(starLoopEntryState.transition(1).target instanceof LoopEndState_1.LoopEndState); this.checkCondition(!starLoopEntryState.nonGreedy); } else if (starLoopEntryState.transition(0).target instanceof LoopEndState_1.LoopEndState) { this.checkCondition(starLoopEntryState.transition(1).target instanceof StarBlockStartState_1.StarBlockStartState); this.checkCondition(starLoopEntryState.nonGreedy); } else { throw new Error("IllegalStateException"); } } if (state instanceof StarLoopbackState_1.StarLoopbackState) { this.checkCondition(state.numberOfTransitions === 1); this.checkCondition(state.transition(0).target instanceof StarLoopEntryState_1.StarLoopEntryState); } if (state instanceof LoopEndState_1.LoopEndState) { this.checkCondition(state.loopBackState !== undefined); } if (state instanceof RuleStartState_1.RuleStartState) { this.checkCondition(state.stopState !== undefined); } if (state instanceof BlockStartState_1.BlockStartState) { this.checkCondition(state.endState !== undefined); } if (state instanceof BlockEndState_1.BlockEndState) { this.checkCondition(state.startState !== undefined); } if (state instanceof DecisionState_1.DecisionState) { let decisionState = state; this.checkCondition(decisionState.numberOfTransitions <= 1 || decisionState.decision >= 0); } else { this.checkCondition(state.numberOfTransitions <= 1 || state instanceof RuleStopState_1.RuleStopState); } } } checkCondition(condition, message) { if (!condition) { throw new Error("IllegalStateException: " + message); } } static inlineSetRules(atn) { let inlinedCalls = 0; let ruleToInlineTransition = new Array(atn.ruleToStartState.length); for (let i = 0; i < atn.ruleToStartState.length; i++) { let startState = atn.ruleToStartState[i]; let middleState = startState; while (middleState.onlyHasEpsilonTransitions && middleState.numberOfOptimizedTransitions === 1 && middleState.getOptimizedTransition(0).serializationType === 1 /* EPSILON */) { middleState = middleState.getOptimizedTransition(0).target; } if (middleState.numberOfOptimizedTransitions !== 1) { continue; } let matchTransition = middleState.getOptimizedTransition(0); let matchTarget = matchTransition.target; if (matchTransition.isEpsilon || !matchTarget.onlyHasEpsilonTransitions || matchTarget.numberOfOptimizedTransitions !== 1 || !(matchTarget.getOptimizedTransition(0).target instanceof RuleStopState_1.RuleStopState)) { continue; } switch (matchTransition.serializationType) { case 5 /* ATOM */: case 2 /* RANGE */: case 7 /* SET */: ruleToInlineTransition[i] = matchTransition; break; case 8 /* NOT_SET */: case 9 /* WILDCARD */: // not implemented yet continue; default: continue; } } for (let state of atn.states) { if (state.ruleIndex < 0) { continue; } let optimizedTransitions; for (let i = 0; i < state.numberOfOptimizedTransitions; i++) { let transition = state.getOptimizedTransition(i); if (!(transition instanceof RuleTransition_1.RuleTransition)) { if (optimizedTransitions !== undefined) { optimizedTransitions.push(transition); } continue; } let ruleTransition = transition; let effective = ruleToInlineTransition[ruleTransition.target.ruleIndex]; if (effective === undefined) { if (optimizedTransitions !== undefined) { optimizedTransitions.push(transition); } continue; } if (optimizedTransitions === undefined) { optimizedTransitions = []; for (let j = 0; j < i; j++) { optimizedTransitions.push(state.getOptimizedTransition(i)); } } inlinedCalls++; let target = ruleTransition.followState; let intermediateState = new BasicState_1.BasicState(); intermediateState.setRuleIndex(target.ruleIndex); atn.addState(intermediateState); optimizedTransitions.push(new EpsilonTransition_1.EpsilonTransition(intermediateState)); switch (effective.serializationType) { case 5 /* ATOM */: intermediateState.addTransition(new AtomTransition_1.AtomTransition(target, effective._label)); break; case 2 /* RANGE */: intermediateState.addTransition(new RangeTransition_1.RangeTransition(target, effective.from, effective.to)); break; case 7 /* SET */: intermediateState.addTransition(new SetTransition_1.SetTransition(target, effective.label)); break; default: throw new Error("UnsupportedOperationException"); } } if (optimizedTransitions !== undefined) { if (state.isOptimized) { while (state.numberOfOptimizedTransitions > 0) { state.removeOptimizedTransition(state.numberOfOptimizedTransitions - 1); } } for (let transition of optimizedTransitions) { state.addOptimizedTransition(transition); } } } if (ParserATNSimulator_1.ParserATNSimulator.debug) { console.log("ATN runtime optimizer removed " + inlinedCalls + " rule invocations by inlining sets."); } return inlinedCalls; } static combineChainedEpsilons(atn) { let removedEdges = 0; for (let state of atn.states) { if (!state.onlyHasEpsilonTransitions || state instanceof RuleStopState_1.RuleStopState) { continue; } let optimizedTransitions; nextTransition: for (let i = 0; i < state.numberOfOptimizedTransitions; i++) { let transition = state.getOptimizedTransition(i); let intermediate = transition.target; if (transition.serializationType !== 1 /* EPSILON */ || transition.outermostPrecedenceReturn !== -1 || intermediate.stateType !== ATNStateType_1.ATNStateType.BASIC || !intermediate.onlyHasEpsilonTransitions) { if (optimizedTransitions !== undefined) { optimizedTransitions.push(transition); } continue nextTransition; } for (let j = 0; j < intermediate.numberOfOptimizedTransitions; j++) { if (intermediate.getOptimizedTransition(j).serializationType !== 1 /* EPSILON */ || intermediate.getOptimizedTransition(j).outermostPrecedenceReturn !== -1) { if (optimizedTransitions !== undefined) { optimizedTransitions.push(transition); } continue nextTransition; } } removedEdges++; if (optimizedTransitions === undefined) { optimizedTransitions = []; for (let j = 0; j < i; j++) { optimizedTransitions.push(state.getOptimizedTransition(j)); } } for (let j = 0; j < intermediate.numberOfOptimizedTransitions; j++) { let target = intermediate.getOptimizedTransition(j).target; optimizedTransitions.push(new EpsilonTransition_1.EpsilonTransition(target)); } } if (optimizedTransitions !== undefined) { if (state.isOptimized) { while (state.numberOfOptimizedTransitions > 0) { state.removeOptimizedTransition(state.numberOfOptimizedTransitions - 1); } } for (let transition of optimizedTransitions) { state.addOptimizedTransition(transition); } } } if (ParserATNSimulator_1.ParserATNSimulator.debug) { console.log("ATN runtime optimizer removed " + removedEdges + " transitions by combining chained epsilon transitions."); } return removedEdges; } static optimizeSets(atn, preserveOrder) { if (preserveOrder) { // this optimization currently doesn't preserve edge order. return 0; } let removedPaths = 0; let decisions = atn.decisionToState; for (let decision of decisions) { let setTransitions = new IntervalSet_1.IntervalSet(); for (let i = 0; i < decision.numberOfOptimizedTransitions; i++) { let epsTransition = decision.getOptimizedTransition(i); if (!(epsTransition instanceof EpsilonTransition_1.EpsilonTransition)) { continue; } if (epsTransition.target.numberOfOptimizedTransitions !== 1) { continue; } let transition = epsTransition.target.getOptimizedTransition(0); if (!(transition.target instanceof BlockEndState_1.BlockEndState)) { continue; } if (transition instanceof NotSetTransition_1.NotSetTransition) { // TODO: not yet implemented continue; } if (transition instanceof AtomTransition_1.AtomTransition || transition instanceof RangeTransition_1.RangeTransition || transition instanceof SetTransition_1.SetTransition) { setTransitions.add(i); } } if (setTransitions.size <= 1) { continue; } let optimizedTransitions = []; for (let i = 0; i < decision.numberOfOptimizedTransitions; i++) { if (!setTransitions.contains(i)) { optimizedTransitions.push(decision.getOptimizedTransition(i)); } } let blockEndState = decision.getOptimizedTransition(setTransitions.minElement).target.getOptimizedTransition(0).target; let matchSet = new IntervalSet_1.IntervalSet(); for (let interval of setTransitions.intervals) { for (let j = interval.a; j <= interval.b; j++) { let matchTransition = decision.getOptimizedTransition(j).target.getOptimizedTransition(0); if (matchTransition instanceof NotSetTransition_1.NotSetTransition) { throw new Error("Not yet implemented."); } else { matchSet.addAll(matchTransition.label); } } } let newTransition; if (matchSet.intervals.length === 1) { if (matchSet.size === 1) { newTransition = new AtomTransition_1.AtomTransition(blockEndState, matchSet.minElement); } else { let matchInterval = matchSet.intervals[0]; newTransition = new RangeTransition_1.RangeTransition(blockEndState, matchInterval.a, matchInterval.b); } } else { newTransition = new SetTransition_1.SetTransition(blockEndState, matchSet); } let setOptimizedState = new BasicState_1.BasicState(); setOptimizedState.setRuleIndex(decision.ruleIndex); atn.addState(setOptimizedState); setOptimizedState.addTransition(newTransition); optimizedTransitions.push(new EpsilonTransition_1.EpsilonTransition(setOptimizedState)); removedPaths += decision.numberOfOptimizedTransitions - optimizedTransitions.length; if (decision.isOptimized) { while (decision.numberOfOptimizedTransitions > 0) { decision.removeOptimizedTransition(decision.numberOfOptimizedTransitions - 1); } } for (let transition of optimizedTransitions) { decision.addOptimizedTransition(transition); } } if (ParserATNSimulator_1.ParserATNSimulator.debug) { console.log("ATN runtime optimizer removed " + removedPaths + " paths by collapsing sets."); } return removedPaths; } static identifyTailCalls(atn) { for (let state of atn.states) { for (let i = 0; i < state.numberOfTransitions; i++) { let transition = state.transition(i); if (!(transition instanceof RuleTransition_1.RuleTransition)) { continue; } transition.tailCall = this.testTailCall(atn, transition, false); transition.optimizedTailCall = this.testTailCall(atn, transition, true); } if (!state.isOptimized) { continue; } for (let i = 0; i < state.numberOfOptimizedTransitions; i++) { let transition = state.getOptimizedTransition(i); if (!(transition instanceof RuleTransition_1.RuleTransition)) { continue; } transition.tailCall = this.testTailCall(atn, transition, false); transition.optimizedTailCall = this.testTailCall(atn, transition, true); } } } static testTailCall(atn, transition, optimizedPath) { if (!optimizedPath && transition.tailCall) { return true; } if (optimizedPath && transition.optimizedTailCall) { return true; } let reachable = new BitSet_1.BitSet(atn.states.length); let worklist = []; worklist.push(transition.followState); while (true) { let state = worklist.pop(); if (!state) { break; } if (reachable.get(state.stateNumber)) { continue; } if (state instanceof RuleStopState_1.RuleStopState) { continue; } if (!state.onlyHasEpsilonTransitions) { return false; } let transitionCount = optimizedPath ? state.numberOfOptimizedTransitions : state.numberOfTransitions; for (let i = 0; i < transitionCount; i++) { let t = optimizedPath ? state.getOptimizedTransition(i) : state.transition(i); if (t.serializationType !== 1 /* EPSILON */) { return false; } worklist.push(t.target); } } return true; } static toInt(c) { return c; } static toInt32(data, offset) { return (data[offset] | (data[offset + 1] << 16)) >>> 0; } static toUUID(data, offset) { let leastSigBits = ATNDeserializer.toInt32(data, offset); let lessSigBits = ATNDeserializer.toInt32(data, offset + 2); let moreSigBits = ATNDeserializer.toInt32(data, offset + 4); let mostSigBits = ATNDeserializer.toInt32(data, offset + 6); return new UUID_1.UUID(mostSigBits, moreSigBits, lessSigBits, leastSigBits); } edgeFactory(atn, type, src, trg, arg1, arg2, arg3, sets) { let target = atn.states[trg]; switch (type) { case 1 /* EPSILON */: return new EpsilonTransition_1.EpsilonTransition(target); case 2 /* RANGE */: if (arg3 !== 0) { return new RangeTransition_1.RangeTransition(target, Token_1.Token.EOF, arg2); } else { return new RangeTransition_1.RangeTransition(target, arg1, arg2); } case 3 /* RULE */: let rt = new RuleTransition_1.RuleTransition(atn.states[arg1], arg2, arg3, target); return rt; case 4 /* PREDICATE */: let pt = new PredicateTransition_1.PredicateTransition(target, arg1, arg2, arg3 !== 0); return pt; case 10 /* PRECEDENCE */: return new PrecedencePredicateTransition_1.PrecedencePredicateTransition(target, arg1); case 5 /* ATOM */: if (arg3 !== 0) { return new AtomTransition_1.AtomTransition(target, Token_1.Token.EOF); } else { return new AtomTransition_1.AtomTransition(target, arg1); } case 6 /* ACTION */: let a = new ActionTransition_1.ActionTransition(target, arg1, arg2, arg3 !== 0); return a; case 7 /* SET */: return new SetTransition_1.SetTransition(target, sets[arg1]); case 8 /* NOT_SET */: return new NotSetTransition_1.NotSetTransition(target, sets[arg1]); case 9 /* WILDCARD */: return new WildcardTransition_1.WildcardTransition(target); } throw new Error("The specified transition type is not valid."); } stateFactory(type, ruleIndex) { let s; switch (type) { case ATNStateType_1.ATNStateType.INVALID_TYPE: return new InvalidState_1.InvalidState(); case ATNStateType_1.ATNStateType.BASIC: s = new BasicState_1.BasicState(); break; case ATNStateType_1.ATNStateType.RULE_START: s = new RuleStartState_1.RuleStartState(); break; case ATNStateType_1.ATNStateType.BLOCK_START: s = new BasicBlockStartState_1.BasicBlockStartState(); break; case ATNStateType_1.ATNStateType.PLUS_BLOCK_START: s = new PlusBlockStartState_1.PlusBlockStartState(); break; case ATNStateType_1.ATNStateType.STAR_BLOCK_START: s = new StarBlockStartState_1.StarBlockStartState(); break; case ATNStateType_1.ATNStateType.TOKEN_START: s = new TokensStartState_1.TokensStartState(); break; case ATNStateType_1.ATNStateType.RULE_STOP: s = new RuleStopState_1.RuleStopState(); break; case ATNStateType_1.ATNStateType.BLOCK_END: s = new BlockEndState_1.BlockEndState(); break; case ATNStateType_1.ATNStateType.STAR_LOOP_BACK: s = new StarLoopbackState_1.StarLoopbackState(); b