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