From fc752457587ff0a4edbe412b811d87b9437fb8f6 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 22 Oct 2014 10:52:11 +0200 Subject: [PATCH] IDEA-131542 (Good regexp marked red: illegal/unsupported escape sequence) --- .../org/intellij/lang/regexp/_RegExLexer.java | 203 ++++++++++-------- .../lang/regexp/RegExpCapability.java | 1 + .../lang/regexp/RegExpParserDefinition.java | 2 +- .../org/intellij/lang/regexp/RegExpTT.java | 2 +- .../intellij/lang/regexp/regexp-lexer.flex | 6 +- RegExpSupport/testData/RETest.xml | 7 + 6 files changed, 127 insertions(+), 94 deletions(-) diff --git a/RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java b/RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java index e2afe5aa8493..b35848683e2d 100644 --- a/RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java +++ b/RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java @@ -1,4 +1,4 @@ -/* The following code was generated by JFlex 1.4.3 on 4/29/14 2:27 PM */ +/* The following code was generated by JFlex 1.4.3 on 10/22/14 10:42 AM */ /* It's an automatically generated code. Do not modify it. */ package org.intellij.lang.regexp; @@ -15,8 +15,8 @@ import com.intellij.psi.StringEscapesTokenTypes; /** * This class is a scanner generated by * JFlex 1.4.3 - * on 4/29/14 2:27 PM from the specification file - * C:/idea_src/ultimate/tools/lexer/../../community/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex + * on 10/22/14 10:42 AM from the specification file + * /Users/bas/Projects/IntelliJ IDEA Ultimate/tools/lexer/../../community/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex */ class _RegExLexer implements FlexLexer { /** initial size of the lookahead buffer */ @@ -56,69 +56,90 @@ class _RegExLexer implements FlexLexer { "\1\61\1\15\1\0\1\52\1\62\1\4\1\5\1\17\1\20\1\51"+ "\1\43\1\3\1\0\1\2\7\42\2\1\1\54\1\0\1\60\1\56"+ "\1\55\1\16\1\0\1\24\1\24\1\30\1\27\1\37\1\35\1\25"+ - "\1\44\1\32\6\45\1\34\1\36\1\45\1\26\3\45\1\26\1\26"+ - "\1\45\1\25\1\10\1\12\1\11\1\14\1\47\1\0\1\23\1\24"+ - "\1\31\1\27\1\23\1\23\1\45\1\44\1\32\4\45\1\22\1\45"+ - "\1\33\1\45\1\22\1\26\1\22\1\41\1\45\1\26\1\40\1\45"+ - "\1\25\1\6\1\21\1\7\54\0\1\45\12\0\1\45\4\0\1\45"+ - "\5\0\27\45\1\0\37\45\1\0\u013f\45\31\0\162\45\4\0\14\45"+ - "\16\0\5\45\11\0\1\45\213\0\1\45\13\0\1\45\1\0\3\45"+ - "\1\0\1\45\1\0\24\45\1\0\54\45\1\0\46\45\1\0\5\45"+ - "\4\0\202\45\10\0\105\45\1\0\46\45\2\0\2\45\6\0\20\45"+ - "\41\0\46\45\2\0\1\45\7\0\47\45\110\0\33\45\5\0\3\45"+ - "\56\0\32\45\5\0\13\45\25\0\12\50\4\0\2\45\1\0\143\45"+ - "\1\0\1\45\17\0\2\45\7\0\2\45\12\50\3\45\2\0\1\45"+ - "\20\0\1\45\1\0\36\45\35\0\3\45\60\0\46\45\13\0\1\45"+ - "\u0152\0\66\45\3\0\1\45\22\0\1\45\7\0\12\45\4\0\12\50"+ - "\25\0\10\45\2\0\2\45\2\0\26\45\1\0\7\45\1\0\1\45"+ - "\3\0\4\45\3\0\1\45\36\0\2\45\1\0\3\45\4\0\12\50"+ - "\2\45\23\0\6\45\4\0\2\45\2\0\26\45\1\0\7\45\1\0"+ - "\2\45\1\0\2\45\1\0\2\45\37\0\4\45\1\0\1\45\7\0"+ - "\12\50\2\0\3\45\20\0\11\45\1\0\3\45\1\0\26\45\1\0"+ - "\7\45\1\0\2\45\1\0\5\45\3\0\1\45\22\0\1\45\17\0"+ - "\2\45\4\0\12\50\25\0\10\45\2\0\2\45\2\0\26\45\1\0"+ - "\7\45\1\0\2\45\1\0\5\45\3\0\1\45\36\0\2\45\1\0"+ - "\3\45\4\0\12\50\1\0\1\45\21\0\1\45\1\0\6\45\3\0"+ - "\3\45\1\0\4\45\3\0\2\45\1\0\1\45\1\0\2\45\3\0"+ - "\2\45\3\0\3\45\3\0\10\45\1\0\3\45\55\0\11\50\25\0"+ - "\10\45\1\0\3\45\1\0\27\45\1\0\12\45\1\0\5\45\46\0"+ - "\2\45\4\0\12\50\25\0\10\45\1\0\3\45\1\0\27\45\1\0"+ - "\12\45\1\0\5\45\3\0\1\45\40\0\1\45\1\0\2\45\4\0"+ - "\12\50\25\0\10\45\1\0\3\45\1\0\27\45\1\0\20\45\46\0"+ - "\2\45\4\0\12\50\25\0\22\45\3\0\30\45\1\0\11\45\1\0"+ - "\1\45\2\0\7\45\72\0\60\45\1\0\2\45\14\0\7\45\11\0"+ - "\12\50\47\0\2\45\1\0\1\45\2\0\2\45\1\0\1\45\2\0"+ - "\1\45\6\0\4\45\1\0\7\45\1\0\3\45\1\0\1\45\1\0"+ - "\1\45\2\0\2\45\1\0\4\45\1\0\2\45\11\0\1\45\2\0"+ - "\5\45\1\0\1\45\11\0\12\50\2\0\2\45\42\0\1\45\37\0"+ - "\12\50\26\0\10\45\1\0\42\45\35\0\4\45\164\0\42\45\1\0"+ - "\5\45\1\0\2\45\25\0\12\50\6\0\6\45\112\0\46\45\12\0"+ - "\51\45\7\0\132\45\5\0\104\45\5\0\122\45\6\0\7\45\1\0"+ - "\77\45\1\0\1\45\1\0\4\45\2\0\7\45\1\0\1\45\1\0"+ - "\4\45\2\0\47\45\1\0\1\45\1\0\4\45\2\0\37\45\1\0"+ - "\1\45\1\0\4\45\2\0\7\45\1\0\1\45\1\0\4\45\2\0"+ - "\7\45\1\0\7\45\1\0\27\45\1\0\37\45\1\0\1\45\1\0"+ - "\4\45\2\0\7\45\1\0\47\45\1\0\23\45\16\0\11\50\56\0"+ - "\125\45\14\0\u026c\45\2\0\10\45\12\0\32\45\5\0\113\45\25\0"+ - "\15\45\1\0\4\45\16\0\22\45\16\0\22\45\16\0\15\45\1\0"+ - "\3\45\17\0\64\45\43\0\1\45\4\0\1\45\3\0\12\50\46\0"+ - "\12\50\6\0\130\45\10\0\51\45\127\0\35\45\51\0\12\50\36\45"+ - "\2\0\5\45\u038b\0\154\45\224\0\234\45\4\0\132\45\6\0\26\45"+ - "\2\0\6\45\2\0\46\45\2\0\6\45\2\0\10\45\1\0\1\45"+ - "\1\0\1\45\1\0\1\45\1\0\37\45\2\0\65\45\1\0\7\45"+ - "\1\0\1\45\3\0\3\45\1\0\7\45\3\0\4\45\2\0\6\45"+ - "\4\0\15\45\5\0\3\45\1\0\7\45\164\0\1\45\15\0\1\45"+ - "\202\0\1\45\4\0\1\45\2\0\12\45\1\0\1\45\3\0\5\45"+ - "\6\0\1\45\1\0\1\45\1\0\1\45\1\0\4\45\1\0\3\45"+ - "\1\0\7\45\3\0\3\45\5\0\5\45\u0ebb\0\2\45\52\0\5\45"+ - "\5\0\2\45\4\0\126\45\6\0\3\45\1\0\132\45\1\0\4\45"+ - "\5\0\50\45\4\0\136\45\21\0\30\45\70\0\20\45\u0200\0\u19b6\45"+ - "\112\0\u51a6\45\132\0\u048d\45\u0773\0\u2ba4\45\u215c\0\u012e\45\2\0\73\45"+ - "\225\0\7\45\14\0\5\45\5\0\1\45\1\0\12\45\1\0\15\45"+ - "\1\0\5\45\1\0\1\45\1\0\2\45\1\0\2\45\1\0\154\45"+ - "\41\0\u016b\45\22\0\100\45\2\0\66\45\50\0\14\45\164\0\5\45"+ - "\1\0\207\45\23\0\12\50\7\0\32\45\6\0\32\45\13\0\131\45"+ - "\3\0\6\45\2\0\6\45\2\0\6\45\2\0\3\45\43\0"; + "\1\44\1\32\6\45\1\34\1\36\1\45\1\26\2\45\1\26\1\26"+ + "\1\26\1\45\1\25\1\10\1\12\1\11\1\14\1\47\1\0\1\23"+ + "\1\24\1\31\1\27\1\23\1\23\1\45\1\44\1\32\4\45\1\22"+ + "\1\45\1\33\1\45\1\22\1\26\1\22\1\41\1\26\1\26\1\40"+ + "\1\45\1\25\1\6\1\21\1\7\54\0\1\45\12\0\1\45\4\0"+ + "\1\45\5\0\27\45\1\0\37\45\1\0\u01ca\45\4\0\14\45\16\0"+ + "\5\45\7\0\1\45\1\0\1\45\201\0\5\45\1\0\2\45\2\0"+ + "\4\45\10\0\1\45\1\0\3\45\1\0\1\45\1\0\24\45\1\0"+ + "\123\45\1\0\213\45\10\0\236\45\11\0\46\45\2\0\1\45\7\0"+ + "\47\45\110\0\33\45\5\0\3\45\55\0\53\45\25\0\12\50\4\0"+ + "\2\45\1\0\143\45\1\0\1\45\17\0\2\45\7\0\2\45\12\50"+ + "\3\45\2\0\1\45\20\0\1\45\1\0\36\45\35\0\131\45\13\0"+ + "\1\45\16\0\12\50\41\45\11\0\2\45\4\0\1\45\5\0\26\45"+ + "\4\0\1\45\11\0\1\45\3\0\1\45\27\0\31\45\107\0\1\45"+ + "\1\0\13\45\127\0\66\45\3\0\1\45\22\0\1\45\7\0\12\45"+ + "\4\0\12\50\1\0\7\45\1\0\7\45\5\0\10\45\2\0\2\45"+ + "\2\0\26\45\1\0\7\45\1\0\1\45\3\0\4\45\3\0\1\45"+ + "\20\0\1\45\15\0\2\45\1\0\3\45\4\0\12\50\2\45\23\0"+ + "\6\45\4\0\2\45\2\0\26\45\1\0\7\45\1\0\2\45\1\0"+ + "\2\45\1\0\2\45\37\0\4\45\1\0\1\45\7\0\12\50\2\0"+ + "\3\45\20\0\11\45\1\0\3\45\1\0\26\45\1\0\7\45\1\0"+ + "\2\45\1\0\5\45\3\0\1\45\22\0\1\45\17\0\2\45\4\0"+ + "\12\50\25\0\10\45\2\0\2\45\2\0\26\45\1\0\7\45\1\0"+ + "\2\45\1\0\5\45\3\0\1\45\36\0\2\45\1\0\3\45\4\0"+ + "\12\50\1\0\1\45\21\0\1\45\1\0\6\45\3\0\3\45\1\0"+ + "\4\45\3\0\2\45\1\0\1\45\1\0\2\45\3\0\2\45\3\0"+ + "\3\45\3\0\14\45\26\0\1\45\25\0\12\50\25\0\10\45\1\0"+ + "\3\45\1\0\27\45\1\0\12\45\1\0\5\45\3\0\1\45\32\0"+ + "\2\45\6\0\2\45\4\0\12\50\25\0\10\45\1\0\3\45\1\0"+ + "\27\45\1\0\12\45\1\0\5\45\3\0\1\45\40\0\1\45\1\0"+ + "\2\45\4\0\12\50\1\0\2\45\22\0\10\45\1\0\3\45\1\0"+ + "\51\45\2\0\1\45\20\0\1\45\21\0\2\45\4\0\12\50\12\0"+ + "\6\45\5\0\22\45\3\0\30\45\1\0\11\45\1\0\1\45\2\0"+ + "\7\45\72\0\60\45\1\0\2\45\14\0\7\45\11\0\12\50\47\0"+ + "\2\45\1\0\1\45\2\0\2\45\1\0\1\45\2\0\1\45\6\0"+ + "\4\45\1\0\7\45\1\0\3\45\1\0\1\45\1\0\1\45\2\0"+ + "\2\45\1\0\4\45\1\0\2\45\11\0\1\45\2\0\5\45\1\0"+ + "\1\45\11\0\12\50\2\0\4\45\40\0\1\45\37\0\12\50\26\0"+ + "\10\45\1\0\44\45\33\0\5\45\163\0\53\45\24\0\1\45\12\50"+ + "\6\0\6\45\4\0\4\45\3\0\1\45\3\0\2\45\7\0\3\45"+ + "\4\0\15\45\14\0\1\45\1\0\12\50\6\0\46\45\1\0\1\45"+ + "\5\0\1\45\2\0\53\45\1\0\u014d\45\1\0\4\45\2\0\7\45"+ + "\1\0\1\45\1\0\4\45\2\0\51\45\1\0\4\45\2\0\41\45"+ + "\1\0\4\45\2\0\7\45\1\0\1\45\1\0\4\45\2\0\17\45"+ + "\1\0\71\45\1\0\4\45\2\0\103\45\45\0\20\45\20\0\125\45"+ + "\14\0\u026c\45\2\0\21\45\1\0\32\45\5\0\113\45\25\0\15\45"+ + "\1\0\4\45\16\0\22\45\16\0\22\45\16\0\15\45\1\0\3\45"+ + "\17\0\64\45\43\0\1\45\4\0\1\45\3\0\12\50\46\0\12\50"+ + "\6\0\130\45\10\0\51\45\1\0\1\45\5\0\106\45\12\0\35\45"+ + "\51\0\12\50\36\45\2\0\5\45\13\0\54\45\25\0\7\45\10\0"+ + "\12\50\46\0\27\45\11\0\65\45\53\0\12\50\6\0\12\50\15\0"+ + "\1\45\135\0\57\45\21\0\7\45\4\0\12\50\51\0\36\45\15\0"+ + "\2\45\12\50\54\45\32\0\44\45\34\0\12\50\3\0\3\45\12\50"+ + "\44\45\153\0\4\45\1\0\4\45\3\0\2\45\11\0\300\45\100\0"+ + "\u0116\45\2\0\6\45\2\0\46\45\2\0\6\45\2\0\10\45\1\0"+ + "\1\45\1\0\1\45\1\0\1\45\1\0\37\45\2\0\65\45\1\0"+ + "\7\45\1\0\1\45\3\0\3\45\1\0\7\45\3\0\4\45\2\0"+ + "\6\45\4\0\15\45\5\0\3\45\1\0\7\45\164\0\1\45\15\0"+ + "\1\45\20\0\15\45\145\0\1\45\4\0\1\45\2\0\12\45\1\0"+ + "\1\45\3\0\5\45\6\0\1\45\1\0\1\45\1\0\1\45\1\0"+ + "\4\45\1\0\13\45\2\0\4\45\5\0\5\45\4\0\1\45\64\0"+ + "\2\45\u0a7b\0\57\45\1\0\57\45\1\0\205\45\6\0\4\45\3\0"+ + "\2\45\14\0\46\45\1\0\1\45\5\0\1\45\2\0\70\45\7\0"+ + "\1\45\20\0\27\45\11\0\7\45\1\0\7\45\1\0\7\45\1\0"+ + "\7\45\1\0\7\45\1\0\7\45\1\0\7\45\1\0\7\45\120\0"+ + "\1\45\u01d5\0\2\45\52\0\5\45\5\0\2\45\4\0\126\45\6\0"+ + "\3\45\1\0\132\45\1\0\4\45\5\0\51\45\3\0\136\45\21\0"+ + "\33\45\65\0\20\45\u0200\0\u19b6\45\112\0\u51cd\45\63\0\u048d\45\103\0"+ + "\56\45\2\0\u010d\45\3\0\20\45\12\50\2\45\24\0\57\45\20\0"+ + "\31\45\10\0\106\45\61\0\11\45\2\0\147\45\2\0\4\45\1\0"+ + "\4\45\14\0\13\45\115\0\12\45\1\0\3\45\1\0\4\45\1\0"+ + "\27\45\35\0\64\45\16\0\62\45\34\0\12\50\30\0\6\45\3\0"+ + "\1\45\4\0\12\50\34\45\12\0\27\45\31\0\35\45\7\0\57\45"+ + "\34\0\1\45\12\50\46\0\51\45\27\0\3\45\1\0\10\45\4\0"+ + "\12\50\6\0\27\45\3\0\1\45\5\0\60\45\1\0\1\45\3\0"+ + "\2\45\2\0\5\45\2\0\1\45\1\0\1\45\30\0\3\45\2\0"+ + "\13\45\7\0\3\45\14\0\6\45\2\0\6\45\2\0\6\45\11\0"+ + "\7\45\1\0\7\45\221\0\43\45\15\0\12\50\6\0\u2ba4\45\14\0"+ + "\27\45\4\0\61\45\u2104\0\u016e\45\2\0\152\45\46\0\7\45\14\0"+ + "\5\45\5\0\1\45\1\0\12\45\1\0\15\45\1\0\5\45\1\0"+ + "\1\45\1\0\2\45\1\0\2\45\1\0\154\45\41\0\u016b\45\22\0"+ + "\100\45\2\0\66\45\50\0\14\45\164\0\5\45\1\0\207\45\23\0"+ + "\12\50\7\0\32\45\6\0\32\45\13\0\131\45\3\0\6\45\2\0"+ + "\6\45\2\0\6\45\2\0\3\45\43\0"; /** * Translates characters to character classes @@ -378,6 +399,7 @@ class _RegExLexer implements FlexLexer { private boolean allowOctalNoLeadingZero; private boolean allowHexDigitClass; private boolean allowEmptyCharacterClass; + private boolean allowHorizontalWhitespaceClass; _RegExLexer(EnumSet capabilities) { this((java.io.Reader)null); @@ -387,6 +409,7 @@ class _RegExLexer implements FlexLexer { this.allowOctalNoLeadingZero = capabilities.contains(RegExpCapability.OCTAL_NO_LEADING_ZERO); this.commentMode = capabilities.contains(RegExpCapability.COMMENT_MODE); this.allowHexDigitClass = capabilities.contains(RegExpCapability.ALLOW_HEX_DIGIT_CLASS); + this.allowHorizontalWhitespaceClass = capabilities.contains(RegExpCapability.ALLOW_HORIZONTAL_WHITESPACE_CLASS); this.allowEmptyCharacterClass = capabilities.contains(RegExpCapability.ALLOW_EMPTY_CHARACTER_CLASS); } @@ -435,7 +458,7 @@ class _RegExLexer implements FlexLexer { char [] map = new char[0x10000]; int i = 0; /* index in packed string */ int j = 0; /* index in unpacked array */ - while (i < 1338) { + while (i < 1752) { int count = packed.charAt(i++); char value = packed.charAt(i++); do map[j++] = value; while (--count > 0); @@ -862,22 +885,18 @@ class _RegExLexer implements FlexLexer { { return RegExpTT.QUEST; } case 122: break; - case 54: - { return (allowHexDigitClass ? RegExpTT.CHAR_CLASS : StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN); - } - case 123: break; case 15: { return RegExpTT.PLUS; } - case 124: break; + case 123: break; case 66: { return RegExpTT.OCT_CHAR; } - case 125: break; + case 124: break; case 38: { yybegin(YYINITIAL); return RegExpTT.QUOTE; } - case 126: break; + case 125: break; case 20: { if (allowDanglingMetacharacters) { yypopstate(); yypushback(1); @@ -885,15 +904,15 @@ class _RegExLexer implements FlexLexer { return RegExpTT.BAD_CHARACTER; } } - case 127: break; + case 126: break; case 31: { yypopstate(); yypushback(1); } - case 128: break; + case 127: break; case 27: { yybegin(CLASS1); return RegExpTT.CARET; } - case 129: break; + case 128: break; case 56: // lookahead expression with fixed base length zzMarkedPos = zzStartRead + 1; @@ -903,59 +922,63 @@ class _RegExLexer implements FlexLexer { } return RegExpTT.CHARACTER; } - case 130: break; + case 129: break; case 57: { if (!allowNestedCharacterClasses) return RegExpTT.CHARACTER; return RegExpTT.REDUNDANT_ESCAPE; } - case 131: break; + case 130: break; case 37: { yybegin(YYINITIAL); return RegExpTT.GT; } - case 132: break; + case 131: break; case 68: { yybegin(PY_NAMED_GROUP_REF); return RegExpTT.PYTHON_NAMED_GROUP_REF; } - case 133: break; + case 132: break; case 16: { return RegExpTT.UNION; } - case 134: break; + case 133: break; case 3: { return RegExpTT.CHARACTER; } - case 135: break; + case 134: break; case 63: { yybegin(NAMED_GROUP); return RegExpTT.RUBY_NAMED_GROUP; } - case 136: break; + case 135: break; case 39: { yybegin(OPTIONS); return RegExpTT.SET_OPTIONS; } - case 137: break; + case 136: break; case 26: { yybegin(CLASS2); return RegExpTT.CHARACTER; } - case 138: break; + case 137: break; case 67: { if (xmlSchemaMode) { yypushback(1); return RegExpTT.CHAR_CLASS; } else return RegExpTT.CTRL; } - case 139: break; + case 138: break; case 30: { return commentMode ? com.intellij.psi.TokenType.WHITE_SPACE : RegExpTT.ESC_CHARACTER; } - case 140: break; + case 139: break; case 12: { return RegExpTT.DOLLAR; } - case 141: break; + case 140: break; case 49: { if (xmlSchemaMode) return RegExpTT.CHAR_CLASS; else return StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN; } - case 142: break; + case 141: break; case 41: { return RegExpTT.REDUNDANT_ESCAPE; } + case 142: break; + case 54: + { return (allowHexDigitClass || allowHorizontalWhitespaceClass ? RegExpTT.CHAR_CLASS : StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN); + } case 143: break; case 47: { return yystate() != CLASS2 ? RegExpTT.BOUNDARY : RegExpTT.ESC_CHARACTER; diff --git a/RegExpSupport/src/org/intellij/lang/regexp/RegExpCapability.java b/RegExpSupport/src/org/intellij/lang/regexp/RegExpCapability.java index 81db82a112a6..330441b22e3e 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/RegExpCapability.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/RegExpCapability.java @@ -27,4 +27,5 @@ public enum RegExpCapability { COMMENT_MODE, ALLOW_HEX_DIGIT_CLASS, ALLOW_EMPTY_CHARACTER_CLASS, + ALLOW_HORIZONTAL_WHITESPACE_CLASS } diff --git a/RegExpSupport/src/org/intellij/lang/regexp/RegExpParserDefinition.java b/RegExpSupport/src/org/intellij/lang/regexp/RegExpParserDefinition.java index 2148acb3bb13..18be01fdc1a8 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/RegExpParserDefinition.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/RegExpParserDefinition.java @@ -38,7 +38,7 @@ public class RegExpParserDefinition implements ParserDefinition { @NotNull public Lexer createLexer(Project project) { - return new RegExpLexer(EnumSet.of(RegExpCapability.NESTED_CHARACTER_CLASSES)); + return new RegExpLexer(EnumSet.of(RegExpCapability.NESTED_CHARACTER_CLASSES, RegExpCapability.ALLOW_HORIZONTAL_WHITESPACE_CLASS)); } public PsiParser createParser(Project project) { diff --git a/RegExpSupport/src/org/intellij/lang/regexp/RegExpTT.java b/RegExpSupport/src/org/intellij/lang/regexp/RegExpTT.java index c9f9b9bb8a09..4d085b31d463 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/RegExpTT.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/RegExpTT.java @@ -75,7 +75,7 @@ public interface RegExpTT { IElementType ESC_CTRL_CHARACTER = new RegExpElementType("ESC_CTRL_CHARACTER"); // "\\" ("." | "|" | "$" | "^" | "?" | "*" | "+" | "[" | "{" | "(" | ")") IElementType ESC_CHARACTER = new RegExpElementType("ESC_CHARACTER"); - // "\\" ("w" | "W" | "s" | "S" | "d" | "D") + // "\\" ("w" | "W" | "s" | "S" | "d" | "D" | "v" | "V" | "h" | "H") IElementType CHAR_CLASS = new RegExpElementType("CHAR_CLASS"); // "\\u" XXXX IElementType UNICODE_CHAR = new RegExpElementType("UNICODE_CHAR"); diff --git a/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex b/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex index 1737148b6cda..af0eb9bb6329 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex +++ b/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex @@ -33,6 +33,7 @@ import com.intellij.psi.StringEscapesTokenTypes; private boolean allowOctalNoLeadingZero; private boolean allowHexDigitClass; private boolean allowEmptyCharacterClass; + private boolean allowHorizontalWhitespaceClass; _RegExLexer(EnumSet capabilities) { this((java.io.Reader)null); @@ -42,6 +43,7 @@ import com.intellij.psi.StringEscapesTokenTypes; this.allowOctalNoLeadingZero = capabilities.contains(RegExpCapability.OCTAL_NO_LEADING_ZERO); this.commentMode = capabilities.contains(RegExpCapability.COMMENT_MODE); this.allowHexDigitClass = capabilities.contains(RegExpCapability.ALLOW_HEX_DIGIT_CLASS); + this.allowHorizontalWhitespaceClass = capabilities.contains(RegExpCapability.ALLOW_HORIZONTAL_WHITESPACE_CLASS); this.allowEmptyCharacterClass = capabilities.contains(RegExpCapability.ALLOW_EMPTY_CHARACTER_CLASS); } @@ -99,7 +101,7 @@ META={ESCAPE} | {DOT} | CONTROL="t" | "n" | "r" | "f" | "a" | "e" BOUNDARY="b" | "B" | "A" | "z" | "Z" | "G" -CLASS="w" | "W" | "s" | "S" | "d" | "D" | "X" | "C" +CLASS="w" | "W" | "s" | "S" | "d" | "D" | "v" | "V" | "X" | "C" XML_CLASS="c" | "C" | "i" | "I" PROP="p" | "P" @@ -159,7 +161,7 @@ HEX_CHAR=[0-9a-fA-F] {ESCAPE} {BOUNDARY} { return yystate() != CLASS2 ? RegExpTT.BOUNDARY : RegExpTT.ESC_CHARACTER; } {ESCAPE} {CONTROL} { return RegExpTT.ESC_CTRL_CHARACTER; } -{ESCAPE} [hH] { return (allowHexDigitClass ? RegExpTT.CHAR_CLASS : StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN); } +{ESCAPE} [hH] { return (allowHexDigitClass || allowHorizontalWhitespaceClass ? RegExpTT.CHAR_CLASS : StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN); } {ESCAPE} [:letter:] { return StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN; } {ESCAPE} [\n\b\t\r\f ] { return commentMode ? RegExpTT.CHARACTER : RegExpTT.REDUNDANT_ESCAPE; } diff --git a/RegExpSupport/testData/RETest.xml b/RegExpSupport/testData/RETest.xml index 10e04dcf80fa..3aac79ea8de6 100644 --- a/RegExpSupport/testData/RETest.xml +++ b/RegExpSupport/testData/RETest.xml @@ -1001,4 +1001,11 @@ OK + + + + \h \H \v \V + OK + +