-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathdebug.ts
71 lines (64 loc) · 2.02 KB
/
debug.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/* eslint-disable @typescript-eslint/no-unused-vars */
import {
CharSet,
CharacterClass,
DFA,
ENFA,
Expression,
FiniteAutomaton,
JS,
NFA,
NoParent,
Transformers,
Words,
combineTransformers,
transform,
} from "../src";
import { performance } from "perf_hooks";
import { logDurations } from "./util";
// util functions
function toNFA(literal: JS.Literal): NFA {
const parser = JS.Parser.fromLiteral(literal);
const { expression, maxCharacter } = parser.parse();
return NFA.fromRegex(expression, { maxCharacter }, { assertions: "disable" });
}
function toENFA(literal: JS.Literal): ENFA {
const parser = JS.Parser.fromLiteral(literal);
const { expression, maxCharacter } = parser.parse();
return ENFA.fromRegex(expression, { maxCharacter }, { assertions: "disable" });
}
const toDFA = (literal: JS.Literal): DFA => DFA.fromFA(toNFA(literal));
function toCharSet(literal: JS.Literal): CharSet {
const parser = JS.Parser.fromLiteral(literal);
const { expression } = parser.parse();
return (expression.alternatives[0].elements[0] as CharacterClass).characters;
}
function toRegExp(value: FiniteAutomaton | CharSet | NoParent<Expression>): RegExp {
let literal;
if (value instanceof CharSet) {
literal = JS.toLiteral({ type: "Concatenation", elements: [{ type: "CharacterClass", characters: value }] });
} else if ("toRegex" in value) {
literal = JS.toLiteral(value.toRegex());
} else {
literal = JS.toLiteral(value);
}
return RegExp(literal.source, literal.flags);
}
function measure<T>(fn: () => T, samples: number = 1, label?: string): T {
const durations: number[] = [];
let result: T;
do {
const start = performance.now();
result = fn();
durations.push(performance.now() - start);
} while (--samples > 0);
logDurations(durations, label ?? fn.toString().replace(/^\(\) => /, ""));
return result;
}
// actual debug code
// DO NOT commit changes to this file
const dfa = toDFA(/a+(?:b+a+)*/);
dfa.minimize();
console.log(toRegExp(dfa));
console.log(toENFA(/a*b/).toString());
console.log(toENFA(/a*?b/).toString());