Syntax.java revision 1312:d1689c1df3aa
1/*
2 * Permission is hereby granted, free of charge, to any person obtaining a copy of
3 * this software and associated documentation files (the "Software"), to deal in
4 * the Software without restriction, including without limitation the rights to
5 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
6 * of the Software, and to permit persons to whom the Software is furnished to do
7 * so, subject to the following conditions:
8 *
9 * The above copyright notice and this permission notice shall be included in all
10 * copies or substantial portions of the Software.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
18 * SOFTWARE.
19 */
20package jdk.nashorn.internal.runtime.regexp.joni;
21
22import static jdk.nashorn.internal.runtime.regexp.joni.constants.MetaChar.INEFFECTIVE_META_CHAR;
23import jdk.nashorn.internal.runtime.regexp.joni.constants.SyntaxProperties;
24
25@SuppressWarnings("javadoc")
26public final class Syntax implements SyntaxProperties {
27    private final int op;
28    private final int op2;
29    private final int behavior;
30    public final int options;
31    public final MetaCharTable metaCharTable;
32
33    public Syntax(final int op, final int op2, final int behavior, final int options, final MetaCharTable metaCharTable) {
34        this.op = op;
35        this.op2 = op2;
36        this.behavior = behavior;
37        this.options = options;
38        this.metaCharTable = metaCharTable;
39    }
40
41    public static class MetaCharTable {
42        public final int esc;
43        public final int anyChar;
44        public final int anyTime;
45        public final int zeroOrOneTime;
46        public final int oneOrMoreTime;
47        public final int anyCharAnyTime;
48
49        public MetaCharTable(final int esc, final int anyChar, final int anyTime,
50                             final int zeroOrOneTime, final int oneOrMoreTime, final int anyCharAnyTime) {
51            this.esc = esc;
52            this.anyChar = anyChar;
53            this.anyTime = anyTime;
54            this.zeroOrOneTime = zeroOrOneTime;
55            this.oneOrMoreTime = oneOrMoreTime;
56            this.anyCharAnyTime = anyCharAnyTime;
57        }
58    }
59
60    //
61    // OP
62    //
63
64    protected boolean isOp(final int opm) {
65        return (op & opm) != 0;
66    }
67
68    public boolean opVariableMetaCharacters() {
69        return isOp(OP_VARIABLE_META_CHARACTERS);
70    }
71
72    public boolean opDotAnyChar() {
73        return isOp(OP_DOT_ANYCHAR);
74    }
75
76    public boolean opAsteriskZeroInf() {
77        return isOp(OP_ASTERISK_ZERO_INF);
78    }
79
80    public boolean opEscAsteriskZeroInf() {
81        return isOp(OP_ESC_ASTERISK_ZERO_INF);
82    }
83
84    public boolean opPlusOneInf() {
85        return isOp(OP_PLUS_ONE_INF);
86    }
87
88    public boolean opEscPlusOneInf() {
89        return isOp(OP_ESC_PLUS_ONE_INF);
90    }
91
92    public boolean opQMarkZeroOne() {
93        return isOp(OP_QMARK_ZERO_ONE);
94    }
95
96    public boolean opEscQMarkZeroOne() {
97        return isOp(OP_ESC_QMARK_ZERO_ONE);
98    }
99
100    public boolean opBraceInterval() {
101        return isOp(OP_BRACE_INTERVAL);
102    }
103
104    public boolean opEscBraceInterval() {
105        return isOp(OP_ESC_BRACE_INTERVAL);
106    }
107
108    public boolean opVBarAlt() {
109        return isOp(OP_VBAR_ALT);
110    }
111
112    public boolean opEscVBarAlt() {
113        return isOp(OP_ESC_VBAR_ALT);
114    }
115
116    public boolean opLParenSubexp() {
117        return isOp(OP_LPAREN_SUBEXP);
118    }
119
120    public boolean opEscLParenSubexp() {
121        return isOp(OP_ESC_LPAREN_SUBEXP);
122    }
123
124    public boolean opEscAZBufAnchor() {
125        return isOp(OP_ESC_AZ_BUF_ANCHOR);
126    }
127
128    public boolean opEscCapitalGBeginAnchor() {
129        return isOp(OP_ESC_CAPITAL_G_BEGIN_ANCHOR);
130    }
131
132    public boolean opDecimalBackref() {
133        return isOp(OP_DECIMAL_BACKREF);
134    }
135
136    public boolean opBracketCC() {
137        return isOp(OP_BRACKET_CC);
138    }
139
140    public boolean opEscWWord() {
141        return isOp(OP_ESC_W_WORD);
142    }
143
144    public boolean opEscLtGtWordBeginEnd() {
145        return isOp(OP_ESC_LTGT_WORD_BEGIN_END);
146    }
147
148    public boolean opEscBWordBound() {
149        return isOp(OP_ESC_B_WORD_BOUND);
150    }
151
152    public boolean opEscSWhiteSpace() {
153        return isOp(OP_ESC_S_WHITE_SPACE);
154    }
155
156    public boolean opEscDDigit() {
157        return isOp(OP_ESC_D_DIGIT);
158    }
159
160    public boolean opLineAnchor() {
161        return isOp(OP_LINE_ANCHOR);
162    }
163
164    public boolean opPosixBracket() {
165        return isOp(OP_POSIX_BRACKET);
166    }
167
168    public boolean opQMarkNonGreedy() {
169        return isOp(OP_QMARK_NON_GREEDY);
170    }
171
172    public boolean opEscControlChars() {
173        return isOp(OP_ESC_CONTROL_CHARS);
174    }
175
176    public boolean opEscCControl() {
177        return isOp(OP_ESC_C_CONTROL);
178    }
179
180    public boolean opEscOctal3() {
181        return isOp(OP_ESC_OCTAL3);
182    }
183
184    public boolean opEscXHex2() {
185        return isOp(OP_ESC_X_HEX2);
186    }
187
188    public boolean opEscXBraceHex8() {
189        return isOp(OP_ESC_X_BRACE_HEX8);
190    }
191
192    //
193    // OP2
194    //
195
196    protected boolean isOp2(final int opm) {
197        return (op2 & opm) != 0;
198    }
199
200    public boolean op2EscCapitalQQuote() {
201        return isOp2(OP2_ESC_CAPITAL_Q_QUOTE);
202    }
203
204    public boolean op2QMarkGroupEffect() {
205        return isOp2(OP2_QMARK_GROUP_EFFECT);
206    }
207
208    public boolean op2OptionPerl() {
209        return isOp2(OP2_OPTION_PERL);
210    }
211
212    public boolean op2OptionRuby() {
213        return isOp2(OP2_OPTION_RUBY);
214    }
215
216    public boolean op2PlusPossessiveRepeat() {
217        return isOp2(OP2_PLUS_POSSESSIVE_REPEAT);
218    }
219
220    public boolean op2PlusPossessiveInterval() {
221        return isOp2(OP2_PLUS_POSSESSIVE_INTERVAL);
222    }
223
224    public boolean op2CClassSetOp() {
225        return isOp2(OP2_CCLASS_SET_OP);
226    }
227
228    public boolean op2QMarkLtNamedGroup() {
229        return isOp2(OP2_QMARK_LT_NAMED_GROUP);
230    }
231
232    public boolean op2EscKNamedBackref() {
233        return isOp2(OP2_ESC_K_NAMED_BACKREF);
234    }
235
236    public boolean op2EscGSubexpCall() {
237        return isOp2(OP2_ESC_G_SUBEXP_CALL);
238    }
239
240    public boolean op2AtMarkCaptureHistory() {
241        return isOp2(OP2_ATMARK_CAPTURE_HISTORY);
242    }
243
244    public boolean op2EscCapitalCBarControl() {
245        return isOp2(OP2_ESC_CAPITAL_C_BAR_CONTROL);
246    }
247
248    public boolean op2EscCapitalMBarMeta() {
249        return isOp2(OP2_ESC_CAPITAL_M_BAR_META);
250    }
251
252    public boolean op2EscVVtab() {
253        return isOp2(OP2_ESC_V_VTAB);
254    }
255
256    public boolean op2EscUHex4() {
257        return isOp2(OP2_ESC_U_HEX4);
258    }
259
260    public boolean op2EscGnuBufAnchor() {
261        return isOp2(OP2_ESC_GNU_BUF_ANCHOR);
262    }
263
264    public boolean op2EscPBraceCharProperty() {
265        return isOp2(OP2_ESC_P_BRACE_CHAR_PROPERTY);
266    }
267
268    public boolean op2EscPBraceCircumflexNot() {
269        return isOp2(OP2_ESC_P_BRACE_CIRCUMFLEX_NOT);
270    }
271
272    public boolean op2EscHXDigit() {
273        return isOp2(OP2_ESC_H_XDIGIT);
274    }
275
276    public boolean op2IneffectiveEscape() {
277        return isOp2(OP2_INEFFECTIVE_ESCAPE);
278    }
279
280    //
281    // BEHAVIOR
282    //
283
284    protected boolean isBehavior(final int bvm) {
285        return (behavior & bvm) != 0;
286    }
287
288    public boolean contextIndepRepeatOps() {
289        return isBehavior(CONTEXT_INDEP_REPEAT_OPS);
290    }
291
292    public boolean contextInvalidRepeatOps() {
293        return isBehavior(CONTEXT_INVALID_REPEAT_OPS);
294    }
295
296    public boolean allowUnmatchedCloseSubexp() {
297        return isBehavior(ALLOW_UNMATCHED_CLOSE_SUBEXP);
298    }
299
300    public boolean allowInvalidInterval() {
301        return isBehavior(ALLOW_INVALID_INTERVAL);
302    }
303
304    public boolean allowIntervalLowAbbrev() {
305        return isBehavior(ALLOW_INTERVAL_LOW_ABBREV);
306    }
307
308    public boolean strictCheckBackref() {
309        return isBehavior(STRICT_CHECK_BACKREF);
310    }
311
312    public boolean differentLengthAltLookBehind() {
313        return isBehavior(DIFFERENT_LEN_ALT_LOOK_BEHIND);
314    }
315
316    public boolean captureOnlyNamedGroup() {
317        return isBehavior(CAPTURE_ONLY_NAMED_GROUP);
318    }
319
320    public boolean allowMultiplexDefinitionName() {
321        return isBehavior(ALLOW_MULTIPLEX_DEFINITION_NAME);
322    }
323
324    public boolean fixedIntervalIsGreedyOnly() {
325        return isBehavior(FIXED_INTERVAL_IS_GREEDY_ONLY);
326    }
327
328
329    public boolean notNewlineInNegativeCC() {
330        return isBehavior(NOT_NEWLINE_IN_NEGATIVE_CC);
331    }
332
333    public boolean backSlashEscapeInCC() {
334        return isBehavior(BACKSLASH_ESCAPE_IN_CC);
335    }
336
337    public boolean allowEmptyRangeInCC() {
338        return isBehavior(ALLOW_EMPTY_RANGE_IN_CC);
339    }
340
341    public boolean allowDoubleRangeOpInCC() {
342        return isBehavior(ALLOW_DOUBLE_RANGE_OP_IN_CC);
343    }
344
345    public boolean warnCCOpNotEscaped() {
346        return isBehavior(WARN_CC_OP_NOT_ESCAPED);
347    }
348
349    public boolean warnReduntantNestedRepeat() {
350        return isBehavior(WARN_REDUNDANT_NESTED_REPEAT);
351    }
352
353    public static final Syntax RUBY = new Syntax(
354        (( GNU_REGEX_OP | OP_QMARK_NON_GREEDY |
355        OP_ESC_OCTAL3 | OP_ESC_X_HEX2 |
356        OP_ESC_X_BRACE_HEX8 | OP_ESC_CONTROL_CHARS |
357        OP_ESC_C_CONTROL )
358        & ~OP_ESC_LTGT_WORD_BEGIN_END ),
359
360        ( OP2_QMARK_GROUP_EFFECT |
361        OP2_OPTION_RUBY |
362        OP2_QMARK_LT_NAMED_GROUP | OP2_ESC_K_NAMED_BACKREF |
363        OP2_ESC_G_SUBEXP_CALL |
364        OP2_ESC_P_BRACE_CHAR_PROPERTY  |
365        OP2_ESC_P_BRACE_CIRCUMFLEX_NOT |
366        OP2_PLUS_POSSESSIVE_REPEAT |
367        OP2_CCLASS_SET_OP | OP2_ESC_CAPITAL_C_BAR_CONTROL |
368        OP2_ESC_CAPITAL_M_BAR_META | OP2_ESC_V_VTAB |
369        OP2_ESC_H_XDIGIT ),
370
371        ( GNU_REGEX_BV |
372        ALLOW_INTERVAL_LOW_ABBREV |
373        DIFFERENT_LEN_ALT_LOOK_BEHIND |
374        CAPTURE_ONLY_NAMED_GROUP |
375        ALLOW_MULTIPLEX_DEFINITION_NAME |
376        FIXED_INTERVAL_IS_GREEDY_ONLY |
377        WARN_CC_OP_NOT_ESCAPED |
378        WARN_REDUNDANT_NESTED_REPEAT ),
379
380        Option.NONE,
381
382        new MetaCharTable(
383            '\\',                           /* esc */
384            INEFFECTIVE_META_CHAR,          /* anychar '.' */
385            INEFFECTIVE_META_CHAR,          /* anytime '*' */
386            INEFFECTIVE_META_CHAR,          /* zero or one time '?' */
387            INEFFECTIVE_META_CHAR,          /* one or more time '+' */
388            INEFFECTIVE_META_CHAR           /* anychar anytime */
389        )
390    );
391
392    public static final Syntax DEFAULT = RUBY;
393
394    public static final Syntax ASIS = new Syntax(
395        0,
396
397        OP2_INEFFECTIVE_ESCAPE,
398
399        0,
400
401        Option.NONE,
402
403        new MetaCharTable(
404            '\\',                          /* esc */
405            INEFFECTIVE_META_CHAR,         /* anychar '.' */
406            INEFFECTIVE_META_CHAR,         /* anytime '*' */
407            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
408            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
409            INEFFECTIVE_META_CHAR          /* anychar anytime */
410        )
411    );
412
413    public static final Syntax PosixBasic = new Syntax(
414        (POSIX_COMMON_OP | OP_ESC_LPAREN_SUBEXP |
415        OP_ESC_BRACE_INTERVAL ),
416
417        0,
418
419        0,
420
421        ( Option.SINGLELINE | Option.MULTILINE ),
422
423        new MetaCharTable(
424            '\\',                          /* esc */
425            INEFFECTIVE_META_CHAR,         /* anychar '.' */
426            INEFFECTIVE_META_CHAR,         /* anytime '*' */
427            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
428            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
429            INEFFECTIVE_META_CHAR          /* anychar anytime */
430        )
431    );
432
433    public static final Syntax PosixExtended = new Syntax(
434        ( POSIX_COMMON_OP | OP_LPAREN_SUBEXP |
435        OP_BRACE_INTERVAL |
436        OP_PLUS_ONE_INF | OP_QMARK_ZERO_ONE |OP_VBAR_ALT ),
437
438        0,
439
440        ( CONTEXT_INDEP_ANCHORS |
441        CONTEXT_INDEP_REPEAT_OPS | CONTEXT_INVALID_REPEAT_OPS |
442        ALLOW_UNMATCHED_CLOSE_SUBEXP |
443        ALLOW_DOUBLE_RANGE_OP_IN_CC ),
444
445        ( Option.SINGLELINE | Option.MULTILINE ),
446
447        new MetaCharTable(
448            '\\',                          /* esc */
449            INEFFECTIVE_META_CHAR,         /* anychar '.' */
450            INEFFECTIVE_META_CHAR,         /* anytime '*' */
451            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
452            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
453            INEFFECTIVE_META_CHAR          /* anychar anytime */
454        )
455    );
456
457    public static final Syntax Emacs = new Syntax(
458        ( OP_DOT_ANYCHAR | OP_BRACKET_CC |
459        OP_ESC_BRACE_INTERVAL |
460        OP_ESC_LPAREN_SUBEXP | OP_ESC_VBAR_ALT |
461        OP_ASTERISK_ZERO_INF | OP_PLUS_ONE_INF |
462        OP_QMARK_ZERO_ONE | OP_DECIMAL_BACKREF |
463        OP_LINE_ANCHOR | OP_ESC_CONTROL_CHARS ),
464
465        OP2_ESC_GNU_BUF_ANCHOR,
466
467        ALLOW_EMPTY_RANGE_IN_CC,
468
469        Option.NONE,
470
471        new MetaCharTable(
472            '\\',                          /* esc */
473            INEFFECTIVE_META_CHAR,         /* anychar '.' */
474            INEFFECTIVE_META_CHAR,         /* anytime '*' */
475            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
476            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
477            INEFFECTIVE_META_CHAR          /* anychar anytime */
478        )
479    );
480
481    public static final Syntax Grep = new Syntax(
482        ( OP_DOT_ANYCHAR | OP_BRACKET_CC | OP_POSIX_BRACKET |
483        OP_ESC_BRACE_INTERVAL | OP_ESC_LPAREN_SUBEXP |
484        OP_ESC_VBAR_ALT |
485        OP_ASTERISK_ZERO_INF | OP_ESC_PLUS_ONE_INF |
486        OP_ESC_QMARK_ZERO_ONE | OP_LINE_ANCHOR |
487        OP_ESC_W_WORD | OP_ESC_B_WORD_BOUND |
488        OP_ESC_LTGT_WORD_BEGIN_END | OP_DECIMAL_BACKREF ),
489
490        0,
491
492        ( ALLOW_EMPTY_RANGE_IN_CC | NOT_NEWLINE_IN_NEGATIVE_CC ),
493
494        Option.NONE,
495
496        new MetaCharTable(
497            '\\',                          /* esc */
498            INEFFECTIVE_META_CHAR,         /* anychar '.' */
499            INEFFECTIVE_META_CHAR,         /* anytime '*' */
500            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
501            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
502            INEFFECTIVE_META_CHAR          /* anychar anytime */
503        )
504    );
505
506    public static final Syntax GnuRegex = new Syntax(
507        GNU_REGEX_OP,
508        0,
509        GNU_REGEX_BV,
510
511        Option.NONE,
512
513        new MetaCharTable(
514            '\\',                          /* esc */
515            INEFFECTIVE_META_CHAR,         /* anychar '.' */
516            INEFFECTIVE_META_CHAR,         /* anytime '*' */
517            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
518            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
519            INEFFECTIVE_META_CHAR          /* anychar anytime */
520        )
521    );
522
523    public static final Syntax Java = new Syntax(
524        (( GNU_REGEX_OP | OP_QMARK_NON_GREEDY |
525        OP_ESC_CONTROL_CHARS | OP_ESC_C_CONTROL |
526        OP_ESC_OCTAL3 | OP_ESC_X_HEX2 )
527        & ~OP_ESC_LTGT_WORD_BEGIN_END ),
528
529        ( OP2_ESC_CAPITAL_Q_QUOTE | OP2_QMARK_GROUP_EFFECT |
530        OP2_OPTION_PERL | OP2_PLUS_POSSESSIVE_REPEAT |
531        OP2_PLUS_POSSESSIVE_INTERVAL | OP2_CCLASS_SET_OP |
532        OP2_ESC_V_VTAB | OP2_ESC_U_HEX4 |
533        OP2_ESC_P_BRACE_CHAR_PROPERTY ),
534
535        ( GNU_REGEX_BV | DIFFERENT_LEN_ALT_LOOK_BEHIND ),
536
537        Option.SINGLELINE,
538
539        new MetaCharTable(
540            '\\',                          /* esc */
541            INEFFECTIVE_META_CHAR,         /* anychar '.' */
542            INEFFECTIVE_META_CHAR,         /* anytime '*' */
543            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
544            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
545            INEFFECTIVE_META_CHAR          /* anychar anytime */
546        )
547    );
548
549    public static final Syntax Perl = new Syntax(
550        (( GNU_REGEX_OP | OP_QMARK_NON_GREEDY |
551        OP_ESC_OCTAL3 | OP_ESC_X_HEX2 |
552        OP_ESC_X_BRACE_HEX8 | OP_ESC_CONTROL_CHARS |
553        OP_ESC_C_CONTROL )
554        & ~OP_ESC_LTGT_WORD_BEGIN_END ),
555
556        ( OP2_ESC_CAPITAL_Q_QUOTE |
557        OP2_QMARK_GROUP_EFFECT | OP2_OPTION_PERL |
558        OP2_ESC_P_BRACE_CHAR_PROPERTY |
559        OP2_ESC_P_BRACE_CIRCUMFLEX_NOT ),
560
561        GNU_REGEX_BV,
562
563        Option.SINGLELINE,
564
565        new MetaCharTable(
566            '\\',                          /* esc */
567            INEFFECTIVE_META_CHAR,         /* anychar '.' */
568            INEFFECTIVE_META_CHAR,         /* anytime '*' */
569            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
570            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
571            INEFFECTIVE_META_CHAR          /* anychar anytime */
572        )
573    );
574
575    public static final Syntax PerlNG = new Syntax(
576        (( GNU_REGEX_OP | OP_QMARK_NON_GREEDY |
577        OP_ESC_OCTAL3 | OP_ESC_X_HEX2 |
578        OP_ESC_X_BRACE_HEX8 | OP_ESC_CONTROL_CHARS |
579        OP_ESC_C_CONTROL )
580        & ~OP_ESC_LTGT_WORD_BEGIN_END ),
581
582        ( OP2_ESC_CAPITAL_Q_QUOTE |
583        OP2_QMARK_GROUP_EFFECT | OP2_OPTION_PERL |
584        OP2_ESC_P_BRACE_CHAR_PROPERTY  |
585        OP2_ESC_P_BRACE_CIRCUMFLEX_NOT |
586        OP2_QMARK_LT_NAMED_GROUP       |
587        OP2_ESC_K_NAMED_BACKREF        |
588        OP2_ESC_G_SUBEXP_CALL ),
589
590        ( GNU_REGEX_BV |
591        CAPTURE_ONLY_NAMED_GROUP |
592        ALLOW_MULTIPLEX_DEFINITION_NAME ),
593
594        Option.SINGLELINE,
595
596        new MetaCharTable(
597            '\\',                          /* esc */
598            INEFFECTIVE_META_CHAR,         /* anychar '.' */
599            INEFFECTIVE_META_CHAR,         /* anytime '*' */
600            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
601            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
602            INEFFECTIVE_META_CHAR          /* anychar anytime */
603        )
604    );
605
606    public static final Syntax JAVASCRIPT = new Syntax(
607        (( GNU_REGEX_OP | OP_QMARK_NON_GREEDY |
608        OP_ESC_CONTROL_CHARS | OP_ESC_C_CONTROL | OP_ESC_X_HEX2)
609        & ~OP_ESC_LTGT_WORD_BEGIN_END ),
610
611        ( OP2_QMARK_GROUP_EFFECT |
612        OP2_ESC_V_VTAB | OP2_ESC_U_HEX4 ),
613
614        ( GNU_REGEX_BV | DIFFERENT_LEN_ALT_LOOK_BEHIND ),
615
616        Option.SINGLELINE,
617
618        new MetaCharTable(
619            '\\',                          /* esc */
620            INEFFECTIVE_META_CHAR,         /* anychar '.' */
621            INEFFECTIVE_META_CHAR,         /* anytime '*' */
622            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
623            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
624            INEFFECTIVE_META_CHAR          /* anychar anytime */
625        )
626    );
627}
628