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 */ 20 package jdk.nashorn.internal.runtime.regexp.joni; 21 22 import static jdk.nashorn.internal.runtime.regexp.joni.constants.MetaChar.INEFFECTIVE_META_CHAR; 23 import jdk.nashorn.internal.runtime.regexp.joni.constants.SyntaxProperties; 24 25 @SuppressWarnings("javadoc") 26 public 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 }