@hyperjump/json-schema
Version:
A JSON Schema validator with support for custom keywords, vocabularies, and dialects
96 lines (72 loc) • 2.1 kB
JavaScript
export const fromEpsilon = () => {
const start = createState(false);
const end = createState(true);
addEpsilonTransition(start, end);
return { start, end };
};
export const fromSchema = (schema) => {
const start = createState(false);
const end = createState(true);
addTransition(start, end, schema);
return { start, end };
};
export const concat = (first, second) => {
if (first === undefined) {
return second;
}
addEpsilonTransition(first.end, second.start);
first.end.isEnd = false;
return { start: first.start, end: second.end };
};
export const union = (first, second) => {
const start = createState(false);
addEpsilonTransition(start, first.start);
addEpsilonTransition(start, second.start);
const end = createState(true);
addEpsilonTransition(first.end, end);
first.end.isEnd = false;
addEpsilonTransition(second.end, end);
second.end.isEnd = false;
return { start, end };
};
export const closure = (nfa) => {
const start = createState(false);
const end = createState(true);
addEpsilonTransition(start, end);
addEpsilonTransition(start, nfa.start);
addEpsilonTransition(nfa.end, end);
addEpsilonTransition(nfa.end, nfa.start);
nfa.end.isEnd = false;
return { start, end };
};
export const zeroOrOne = (nfa) => {
const start = createState(false);
const end = createState(true);
addEpsilonTransition(start, end);
addEpsilonTransition(start, nfa.start);
addEpsilonTransition(nfa.end, end);
nfa.end.isEnd = false;
return { start, end };
};
export const oneOrMore = (nfa) => {
const start = createState(false);
const end = createState(true);
addEpsilonTransition(start, nfa.start);
addEpsilonTransition(nfa.end, end);
addEpsilonTransition(nfa.end, nfa.start);
nfa.end.isEnd = false;
return { start, end };
};
const addEpsilonTransition = (from, to) => {
from.epsilonTransitions.push(to);
};
const addTransition = (from, to, symbol) => {
from.transition[symbol] = to;
};
const createState = (isEnd) => {
return {
isEnd,
transition: {},
epsilonTransitions: []
};
};