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 }