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.joni;
  21 
  22 import static jdk.nashorn.internal.joni.constants.MetaChar.INEFFECTIVE_META_CHAR;
  23 
  24 import jdk.nashorn.internal.joni.constants.SyntaxProperties;
  25 
  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(int op, int op2, int behavior, int options, 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(int esc, int anyChar, int anyTime,
  50                              int zeroOrOneTime, int oneOrMoreTime, 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(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(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(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 | OP2_CCLASS_SET_OP |
 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 }