fauton
Version:
A library to test any finite automaton with arbitrary alphabets
32 lines (31 loc) • 1.63 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.convertToRegularNfa = void 0;
const epsilonClosureOfState_1 = require("./epsilonClosureOfState");
const moveAndEpsilonClosureStateSet_1 = require("./moveAndEpsilonClosureStateSet");
function convertToRegularNfa(automaton) {
const { transitions, states, alphabets, epsilon_transitions: epsilonTransitions } = automaton;
const epsilonClosureOfStateCache = {};
alphabets.forEach((symbol) => {
states.forEach((state) => {
if (epsilonTransitions && epsilonTransitions[state]) {
const epsilonClosuredStates = !epsilonClosureOfStateCache[state]
? (0, epsilonClosureOfState_1.epsilonClosureOfState)(automaton.epsilon_transitions, state)
: epsilonClosureOfStateCache[state];
if (!epsilonClosureOfStateCache[state]) {
epsilonClosureOfStateCache[state] = epsilonClosuredStates;
}
const epsilonClosuredStatesForSymbol = (0, moveAndEpsilonClosureStateSet_1.moveAndEpsilonClosureStateSet)(transitions, epsilonTransitions, Array.from(epsilonClosuredStates), symbol);
if (transitions[state]) {
transitions[state][symbol] = epsilonClosuredStatesForSymbol;
}
else {
transitions[state] = {
[symbol]: epsilonClosuredStatesForSymbol,
};
}
}
});
});
}
exports.convertToRegularNfa = convertToRegularNfa;