-
Notifications
You must be signed in to change notification settings - Fork 0
/
regex.ts
35 lines (28 loc) 路 879 Bytes
/
regex.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
import {CodeBindings, Var} from 'codedegen';
import {createVar} from '../utils';
import {Reader, ReaderCodegen} from './reader-types';
import {createCodeBindings} from './reader-utils';
/**
* Creates a reader that matches a substring.
*
* @param re The `RegExp` to match.
*/
export function regex(re: RegExp): Reader<any> {
return new RegexReader(re);
}
export class RegexReader implements ReaderCodegen {
re;
constructor(re: RegExp) {
this.re = re.global || re.sticky ? re : new RegExp(re, re.flags + 'g');
}
factory(inputVar: Var, offsetVar: Var, contextVar: Var, resultVar: Var): CodeBindings {
const reVar = createVar();
return createCodeBindings(
[
reVar, '.lastIndex=', offsetVar, ';',
resultVar, '=', reVar, '.test(', inputVar, ')?', reVar, '.lastIndex:-1;',
],
[[reVar, this.re]],
);
}
}