Syntax.java revision 953:221a84ef44c0
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;
23
24import jdk.nashorn.internal.runtime.regexp.joni.constants.SyntaxProperties;
25
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    /**
194     * OP
195     *
196     */
197    protected boolean isOp2(final int opm) {
198        return (op2 & opm) != 0;
199    }
200
201    public boolean op2EscCapitalQQuote() {
202        return isOp2(OP2_ESC_CAPITAL_Q_QUOTE);
203    }
204
205    public boolean op2QMarkGroupEffect() {
206        return isOp2(OP2_QMARK_GROUP_EFFECT);
207    }
208
209    public boolean op2OptionPerl() {
210        return isOp2(OP2_OPTION_PERL);
211    }
212
213    public boolean op2OptionRuby() {
214        return isOp2(OP2_OPTION_RUBY);
215    }
216
217    public boolean op2PlusPossessiveRepeat() {
218        return isOp2(OP2_PLUS_POSSESSIVE_REPEAT);
219    }
220
221    public boolean op2PlusPossessiveInterval() {
222        return isOp2(OP2_PLUS_POSSESSIVE_INTERVAL);
223    }
224
225    public boolean op2CClassSetOp() {
226        return isOp2(OP2_CCLASS_SET_OP);
227    }
228
229    public boolean op2QMarkLtNamedGroup() {
230        return isOp2(OP2_QMARK_LT_NAMED_GROUP);
231    }
232
233    public boolean op2EscKNamedBackref() {
234        return isOp2(OP2_ESC_K_NAMED_BACKREF);
235    }
236
237    public boolean op2EscGSubexpCall() {
238        return isOp2(OP2_ESC_G_SUBEXP_CALL);
239    }
240
241    public boolean op2AtMarkCaptureHistory() {
242        return isOp2(OP2_ATMARK_CAPTURE_HISTORY);
243    }
244
245    public boolean op2EscCapitalCBarControl() {
246        return isOp2(OP2_ESC_CAPITAL_C_BAR_CONTROL);
247    }
248
249    public boolean op2EscCapitalMBarMeta() {
250        return isOp2(OP2_ESC_CAPITAL_M_BAR_META);
251    }
252
253    public boolean op2EscVVtab() {
254        return isOp2(OP2_ESC_V_VTAB);
255    }
256
257    public boolean op2EscUHex4() {
258        return isOp2(OP2_ESC_U_HEX4);
259    }
260
261    public boolean op2EscGnuBufAnchor() {
262        return isOp2(OP2_ESC_GNU_BUF_ANCHOR);
263    }
264
265    public boolean op2EscPBraceCharProperty() {
266        return isOp2(OP2_ESC_P_BRACE_CHAR_PROPERTY);
267    }
268
269    public boolean op2EscPBraceCircumflexNot() {
270        return isOp2(OP2_ESC_P_BRACE_CIRCUMFLEX_NOT);
271    }
272
273    public boolean op2EscHXDigit() {
274        return isOp2(OP2_ESC_H_XDIGIT);
275    }
276
277    public boolean op2IneffectiveEscape() {
278        return isOp2(OP2_INEFFECTIVE_ESCAPE);
279    }
280
281    /**
282     * BEHAVIOR
283     *
284     */
285    protected boolean isBehavior(final int bvm) {
286        return (behavior & bvm) != 0;
287    }
288
289    public boolean contextIndepRepeatOps() {
290        return isBehavior(CONTEXT_INDEP_REPEAT_OPS);
291    }
292
293    public boolean contextInvalidRepeatOps() {
294        return isBehavior(CONTEXT_INVALID_REPEAT_OPS);
295    }
296
297    public boolean allowUnmatchedCloseSubexp() {
298        return isBehavior(ALLOW_UNMATCHED_CLOSE_SUBEXP);
299    }
300
301    public boolean allowInvalidInterval() {
302        return isBehavior(ALLOW_INVALID_INTERVAL);
303    }
304
305    public boolean allowIntervalLowAbbrev() {
306        return isBehavior(ALLOW_INTERVAL_LOW_ABBREV);
307    }
308
309    public boolean strictCheckBackref() {
310        return isBehavior(STRICT_CHECK_BACKREF);
311    }
312
313    public boolean differentLengthAltLookBehind() {
314        return isBehavior(DIFFERENT_LEN_ALT_LOOK_BEHIND);
315    }
316
317    public boolean captureOnlyNamedGroup() {
318        return isBehavior(CAPTURE_ONLY_NAMED_GROUP);
319    }
320
321    public boolean allowMultiplexDefinitionName() {
322        return isBehavior(ALLOW_MULTIPLEX_DEFINITION_NAME);
323    }
324
325    public boolean fixedIntervalIsGreedyOnly() {
326        return isBehavior(FIXED_INTERVAL_IS_GREEDY_ONLY);
327    }
328
329
330    public boolean notNewlineInNegativeCC() {
331        return isBehavior(NOT_NEWLINE_IN_NEGATIVE_CC);
332    }
333
334    public boolean backSlashEscapeInCC() {
335        return isBehavior(BACKSLASH_ESCAPE_IN_CC);
336    }
337
338    public boolean allowEmptyRangeInCC() {
339        return isBehavior(ALLOW_EMPTY_RANGE_IN_CC);
340    }
341
342    public boolean allowDoubleRangeOpInCC() {
343        return isBehavior(ALLOW_DOUBLE_RANGE_OP_IN_CC);
344    }
345
346    public boolean warnCCOpNotEscaped() {
347        return isBehavior(WARN_CC_OP_NOT_ESCAPED);
348    }
349
350    public boolean warnReduntantNestedRepeat() {
351        return isBehavior(WARN_REDUNDANT_NESTED_REPEAT);
352    }
353
354    public static final Syntax RUBY = new Syntax(
355        (( GNU_REGEX_OP | OP_QMARK_NON_GREEDY |
356        OP_ESC_OCTAL3 | OP_ESC_X_HEX2 |
357        OP_ESC_X_BRACE_HEX8 | OP_ESC_CONTROL_CHARS |
358        OP_ESC_C_CONTROL )
359        & ~OP_ESC_LTGT_WORD_BEGIN_END ),
360
361        ( OP2_QMARK_GROUP_EFFECT |
362        OP2_OPTION_RUBY |
363        OP2_QMARK_LT_NAMED_GROUP | OP2_ESC_K_NAMED_BACKREF |
364        OP2_ESC_G_SUBEXP_CALL |
365        OP2_ESC_P_BRACE_CHAR_PROPERTY  |
366        OP2_ESC_P_BRACE_CIRCUMFLEX_NOT |
367        OP2_PLUS_POSSESSIVE_REPEAT |
368        OP2_CCLASS_SET_OP | OP2_ESC_CAPITAL_C_BAR_CONTROL |
369        OP2_ESC_CAPITAL_M_BAR_META | OP2_ESC_V_VTAB |
370        OP2_ESC_H_XDIGIT ),
371
372        ( GNU_REGEX_BV |
373        ALLOW_INTERVAL_LOW_ABBREV |
374        DIFFERENT_LEN_ALT_LOOK_BEHIND |
375        CAPTURE_ONLY_NAMED_GROUP |
376        ALLOW_MULTIPLEX_DEFINITION_NAME |
377        FIXED_INTERVAL_IS_GREEDY_ONLY |
378        WARN_CC_OP_NOT_ESCAPED |
379        WARN_REDUNDANT_NESTED_REPEAT ),
380
381        Option.NONE,
382
383        new MetaCharTable(
384            '\\',                           /* esc */
385            INEFFECTIVE_META_CHAR,          /* anychar '.' */
386            INEFFECTIVE_META_CHAR,          /* anytime '*' */
387            INEFFECTIVE_META_CHAR,          /* zero or one time '?' */
388            INEFFECTIVE_META_CHAR,          /* one or more time '+' */
389            INEFFECTIVE_META_CHAR           /* anychar anytime */
390        )
391    );
392
393    public static final Syntax DEFAULT = RUBY;
394
395    public static final Syntax ASIS = new Syntax(
396        0,
397
398        OP2_INEFFECTIVE_ESCAPE,
399
400        0,
401
402        Option.NONE,
403
404        new MetaCharTable(
405            '\\',                          /* esc */
406            INEFFECTIVE_META_CHAR,         /* anychar '.' */
407            INEFFECTIVE_META_CHAR,         /* anytime '*' */
408            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
409            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
410            INEFFECTIVE_META_CHAR          /* anychar anytime */
411        )
412    );
413
414    public static final Syntax PosixBasic = new Syntax(
415        (POSIX_COMMON_OP | OP_ESC_LPAREN_SUBEXP |
416        OP_ESC_BRACE_INTERVAL ),
417
418        0,
419
420        0,
421
422        ( Option.SINGLELINE | Option.MULTILINE ),
423
424        new MetaCharTable(
425            '\\',                          /* esc */
426            INEFFECTIVE_META_CHAR,         /* anychar '.' */
427            INEFFECTIVE_META_CHAR,         /* anytime '*' */
428            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
429            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
430            INEFFECTIVE_META_CHAR          /* anychar anytime */
431        )
432    );
433
434    public static final Syntax PosixExtended = new Syntax(
435        ( POSIX_COMMON_OP | OP_LPAREN_SUBEXP |
436        OP_BRACE_INTERVAL |
437        OP_PLUS_ONE_INF | OP_QMARK_ZERO_ONE |OP_VBAR_ALT ),
438
439        0,
440
441        ( CONTEXT_INDEP_ANCHORS |
442        CONTEXT_INDEP_REPEAT_OPS | CONTEXT_INVALID_REPEAT_OPS |
443        ALLOW_UNMATCHED_CLOSE_SUBEXP |
444        ALLOW_DOUBLE_RANGE_OP_IN_CC ),
445
446        ( Option.SINGLELINE | Option.MULTILINE ),
447
448        new MetaCharTable(
449            '\\',                          /* esc */
450            INEFFECTIVE_META_CHAR,         /* anychar '.' */
451            INEFFECTIVE_META_CHAR,         /* anytime '*' */
452            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
453            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
454            INEFFECTIVE_META_CHAR          /* anychar anytime */
455        )
456    );
457
458    public static final Syntax Emacs = new Syntax(
459        ( OP_DOT_ANYCHAR | OP_BRACKET_CC |
460        OP_ESC_BRACE_INTERVAL |
461        OP_ESC_LPAREN_SUBEXP | OP_ESC_VBAR_ALT |
462        OP_ASTERISK_ZERO_INF | OP_PLUS_ONE_INF |
463        OP_QMARK_ZERO_ONE | OP_DECIMAL_BACKREF |
464        OP_LINE_ANCHOR | OP_ESC_CONTROL_CHARS ),
465
466        OP2_ESC_GNU_BUF_ANCHOR,
467
468        ALLOW_EMPTY_RANGE_IN_CC,
469
470        Option.NONE,
471
472        new MetaCharTable(
473            '\\',                          /* esc */
474            INEFFECTIVE_META_CHAR,         /* anychar '.' */
475            INEFFECTIVE_META_CHAR,         /* anytime '*' */
476            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
477            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
478            INEFFECTIVE_META_CHAR          /* anychar anytime */
479        )
480    );
481
482    public static final Syntax Grep = new Syntax(
483        ( OP_DOT_ANYCHAR | OP_BRACKET_CC | OP_POSIX_BRACKET |
484        OP_ESC_BRACE_INTERVAL | OP_ESC_LPAREN_SUBEXP |
485        OP_ESC_VBAR_ALT |
486        OP_ASTERISK_ZERO_INF | OP_ESC_PLUS_ONE_INF |
487        OP_ESC_QMARK_ZERO_ONE | OP_LINE_ANCHOR |
488        OP_ESC_W_WORD | OP_ESC_B_WORD_BOUND |
489        OP_ESC_LTGT_WORD_BEGIN_END | OP_DECIMAL_BACKREF ),
490
491        0,
492
493        ( ALLOW_EMPTY_RANGE_IN_CC | NOT_NEWLINE_IN_NEGATIVE_CC ),
494
495        Option.NONE,
496
497        new MetaCharTable(
498            '\\',                          /* esc */
499            INEFFECTIVE_META_CHAR,         /* anychar '.' */
500            INEFFECTIVE_META_CHAR,         /* anytime '*' */
501            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
502            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
503            INEFFECTIVE_META_CHAR          /* anychar anytime */
504        )
505    );
506
507    public static final Syntax GnuRegex = new Syntax(
508        GNU_REGEX_OP,
509        0,
510        GNU_REGEX_BV,
511
512        Option.NONE,
513
514        new MetaCharTable(
515            '\\',                          /* esc */
516            INEFFECTIVE_META_CHAR,         /* anychar '.' */
517            INEFFECTIVE_META_CHAR,         /* anytime '*' */
518            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
519            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
520            INEFFECTIVE_META_CHAR          /* anychar anytime */
521        )
522    );
523
524    public static final Syntax Java = new Syntax(
525        (( GNU_REGEX_OP | OP_QMARK_NON_GREEDY |
526        OP_ESC_CONTROL_CHARS | OP_ESC_C_CONTROL |
527        OP_ESC_OCTAL3 | OP_ESC_X_HEX2 )
528        & ~OP_ESC_LTGT_WORD_BEGIN_END ),
529
530        ( OP2_ESC_CAPITAL_Q_QUOTE | OP2_QMARK_GROUP_EFFECT |
531        OP2_OPTION_PERL | OP2_PLUS_POSSESSIVE_REPEAT |
532        OP2_PLUS_POSSESSIVE_INTERVAL | OP2_CCLASS_SET_OP |
533        OP2_ESC_V_VTAB | OP2_ESC_U_HEX4 |
534        OP2_ESC_P_BRACE_CHAR_PROPERTY ),
535
536        ( GNU_REGEX_BV | DIFFERENT_LEN_ALT_LOOK_BEHIND ),
537
538        Option.SINGLELINE,
539
540        new MetaCharTable(
541            '\\',                          /* esc */
542            INEFFECTIVE_META_CHAR,         /* anychar '.' */
543            INEFFECTIVE_META_CHAR,         /* anytime '*' */
544            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
545            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
546            INEFFECTIVE_META_CHAR          /* anychar anytime */
547        )
548    );
549
550    public static final Syntax Perl = new Syntax(
551        (( GNU_REGEX_OP | OP_QMARK_NON_GREEDY |
552        OP_ESC_OCTAL3 | OP_ESC_X_HEX2 |
553        OP_ESC_X_BRACE_HEX8 | OP_ESC_CONTROL_CHARS |
554        OP_ESC_C_CONTROL )
555        & ~OP_ESC_LTGT_WORD_BEGIN_END ),
556
557        ( OP2_ESC_CAPITAL_Q_QUOTE |
558        OP2_QMARK_GROUP_EFFECT | OP2_OPTION_PERL |
559        OP2_ESC_P_BRACE_CHAR_PROPERTY |
560        OP2_ESC_P_BRACE_CIRCUMFLEX_NOT ),
561
562        GNU_REGEX_BV,
563
564        Option.SINGLELINE,
565
566        new MetaCharTable(
567            '\\',                          /* esc */
568            INEFFECTIVE_META_CHAR,         /* anychar '.' */
569            INEFFECTIVE_META_CHAR,         /* anytime '*' */
570            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
571            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
572            INEFFECTIVE_META_CHAR          /* anychar anytime */
573        )
574    );
575
576    public static final Syntax PerlNG = new Syntax(
577        (( GNU_REGEX_OP | OP_QMARK_NON_GREEDY |
578        OP_ESC_OCTAL3 | OP_ESC_X_HEX2 |
579        OP_ESC_X_BRACE_HEX8 | OP_ESC_CONTROL_CHARS |
580        OP_ESC_C_CONTROL )
581        & ~OP_ESC_LTGT_WORD_BEGIN_END ),
582
583        ( OP2_ESC_CAPITAL_Q_QUOTE |
584        OP2_QMARK_GROUP_EFFECT | OP2_OPTION_PERL |
585        OP2_ESC_P_BRACE_CHAR_PROPERTY  |
586        OP2_ESC_P_BRACE_CIRCUMFLEX_NOT |
587        OP2_QMARK_LT_NAMED_GROUP       |
588        OP2_ESC_K_NAMED_BACKREF        |
589        OP2_ESC_G_SUBEXP_CALL ),
590
591        ( GNU_REGEX_BV |
592        CAPTURE_ONLY_NAMED_GROUP |
593        ALLOW_MULTIPLEX_DEFINITION_NAME ),
594
595        Option.SINGLELINE,
596
597        new MetaCharTable(
598            '\\',                          /* esc */
599            INEFFECTIVE_META_CHAR,         /* anychar '.' */
600            INEFFECTIVE_META_CHAR,         /* anytime '*' */
601            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
602            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
603            INEFFECTIVE_META_CHAR          /* anychar anytime */
604        )
605    );
606
607    public static final Syntax JAVASCRIPT = new Syntax(
608        (( GNU_REGEX_OP | OP_QMARK_NON_GREEDY |
609        OP_ESC_CONTROL_CHARS | OP_ESC_C_CONTROL | OP_ESC_X_HEX2)
610        & ~OP_ESC_LTGT_WORD_BEGIN_END ),
611
612        ( OP2_QMARK_GROUP_EFFECT |
613        OP2_ESC_V_VTAB | OP2_ESC_U_HEX4 ),
614
615        ( GNU_REGEX_BV | DIFFERENT_LEN_ALT_LOOK_BEHIND ),
616
617        Option.SINGLELINE,
618
619        new MetaCharTable(
620            '\\',                          /* esc */
621            INEFFECTIVE_META_CHAR,         /* anychar '.' */
622            INEFFECTIVE_META_CHAR,         /* anytime '*' */
623            INEFFECTIVE_META_CHAR,         /* zero or one time '?' */
624            INEFFECTIVE_META_CHAR,         /* one or more time '+' */
625            INEFFECTIVE_META_CHAR          /* anychar anytime */
626        )
627    );
628}
629