diff --git a/RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java b/RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java index c4c4f4d9a02a..e2afe5aa8493 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/26/14 1:54 PM */ +/* The following code was generated by JFlex 1.4.3 on 4/29/14 2:27 PM */ /* 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/26/14 1:54 PM from the specification file - * /Users/ignatov/src/ultimate/tools/lexer/../../community/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex + * 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 */ class _RegExLexer implements FlexLexer { /** initial size of the lookahead buffer */ @@ -377,6 +377,7 @@ class _RegExLexer implements FlexLexer { private boolean allowNestedCharacterClasses; private boolean allowOctalNoLeadingZero; private boolean allowHexDigitClass; + private boolean allowEmptyCharacterClass; _RegExLexer(EnumSet capabilities) { this((java.io.Reader)null); @@ -386,6 +387,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.allowEmptyCharacterClass = capabilities.contains(RegExpCapability.ALLOW_EMPTY_CHARACTER_CLASS); } private void yypushstate(int state) { @@ -787,6 +789,18 @@ class _RegExLexer implements FlexLexer { { yybegin(QUOTED_NAMED_GROUP); return RegExpTT.RUBY_QUOTED_NAMED_GROUP; } case 107: break; + case 65: + // lookahead expression with fixed base length + zzMarkedPos = zzStartRead + 1; + { if (allowEmptyCharacterClass) { + yypushstate(CLASS1PY); + } + else { + yypushstate(CLASS2); + } + return RegExpTT.CLASS_BEGIN; + } + case 108: break; case 28: { if (allowNestedCharacterClasses) { yypushstate(CLASS2); @@ -794,87 +808,75 @@ class _RegExLexer implements FlexLexer { } return RegExpTT.CHARACTER; } - case 108: break; + case 109: break; case 19: { if (commentMode) { yypushstate(COMMENT); return RegExpTT.COMMENT; } else return RegExpTT.CHARACTER; } - case 109: break; + case 110: break; case 50: { yypushstate(PROP); return RegExpTT.PROPERTY; } - case 110: break; + case 111: break; case 8: { yypushstate(CLASS2); return RegExpTT.CLASS_BEGIN; } - case 111: break; + case 112: break; case 70: { return RegExpTT.POS_LOOKBEHIND; } - case 112: break; + case 113: break; case 42: { return yystate() != CLASS2 ? RegExpTT.BACKREF : RegExpTT.ESC_CHARACTER; } - case 113: break; + case 114: break; case 72: { return RegExpTT.HEX_CHAR; } - case 114: break; + case 115: break; case 1: { handleOptions(); return RegExpTT.OPTIONS_ON; } - case 115: break; + case 116: break; case 58: { return allowNestedCharacterClasses ? RegExpTT.ANDAND : RegExpTT.CHARACTER; } - case 116: break; + case 117: break; case 2: { yypopstate(); return RegExpTT.COMMENT; } - case 117: break; + case 118: break; case 17: { return RegExpTT.MINUS; } - case 118: break; + case 119: break; case 46: { return RegExpTT.ESC_CTRL_CHARACTER; } - case 119: break; + case 120: break; case 32: { yypopstate(); yypushstate(EMBRACED); return RegExpTT.LBRACE; } - case 120: break; + case 121: break; case 13: { return RegExpTT.QUEST; } - case 121: break; + case 122: break; case 54: { return (allowHexDigitClass ? RegExpTT.CHAR_CLASS : StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN); } - case 122: break; + case 123: break; case 15: { return RegExpTT.PLUS; } - case 123: break; + case 124: break; case 66: { return RegExpTT.OCT_CHAR; } - case 124: break; + case 125: break; case 38: { yybegin(YYINITIAL); return RegExpTT.QUOTE; } - case 125: break; - case 65: - // lookahead expression with fixed base length - zzMarkedPos = zzStartRead + 1; - { if (!allowNestedCharacterClasses) { - yypushstate(CLASS1PY); - } - else { - yypushstate(CLASS2); - } - return RegExpTT.CLASS_BEGIN; - } case 126: break; case 20: { if (allowDanglingMetacharacters) { diff --git a/RegExpSupport/src/org/intellij/lang/regexp/RegExpCapability.java b/RegExpSupport/src/org/intellij/lang/regexp/RegExpCapability.java index 7f92413b8f57..81db82a112a6 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/RegExpCapability.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/RegExpCapability.java @@ -26,4 +26,5 @@ public enum RegExpCapability { OMIT_NUMBERS_IN_QUANTIFIERS, COMMENT_MODE, ALLOW_HEX_DIGIT_CLASS, + ALLOW_EMPTY_CHARACTER_CLASS, } diff --git a/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex b/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex index 88e6b00318d0..1737148b6cda 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex +++ b/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex @@ -32,6 +32,7 @@ import com.intellij.psi.StringEscapesTokenTypes; private boolean allowNestedCharacterClasses; private boolean allowOctalNoLeadingZero; private boolean allowHexDigitClass; + private boolean allowEmptyCharacterClass; _RegExLexer(EnumSet capabilities) { this((java.io.Reader)null); @@ -41,6 +42,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.allowEmptyCharacterClass = capabilities.contains(RegExpCapability.ALLOW_EMPTY_CHARACTER_CLASS); } private void yypushstate(int state) { @@ -217,7 +219,7 @@ HEX_CHAR=[0-9a-fA-F] return RegExpTT.CLASS_BEGIN; } /* Python understands that, Java doesn't */ -{LBRACKET} / "^" {RBRACKET} { if (!allowNestedCharacterClasses) { +{LBRACKET} / "^" {RBRACKET} { if (allowEmptyCharacterClass) { yypushstate(CLASS1PY); } else { diff --git a/plugins/IntelliLang/src/META-INF/intellilang-js-support.xml b/plugins/IntelliLang/src/META-INF/intellilang-js-support.xml index 33f46529f212..f24ab7aeeeb3 100644 --- a/plugins/IntelliLang/src/META-INF/intellilang-js-support.xml +++ b/plugins/IntelliLang/src/META-INF/intellilang-js-support.xml @@ -8,5 +8,8 @@ + + \ No newline at end of file diff --git a/python/src/com/jetbrains/python/codeInsight/regexp/PythonRegexpParserDefinition.java b/python/src/com/jetbrains/python/codeInsight/regexp/PythonRegexpParserDefinition.java index 3fd5a0752986..8cb83a8d0c96 100644 --- a/python/src/com/jetbrains/python/codeInsight/regexp/PythonRegexpParserDefinition.java +++ b/python/src/com/jetbrains/python/codeInsight/regexp/PythonRegexpParserDefinition.java @@ -33,7 +33,8 @@ public class PythonRegexpParserDefinition extends RegExpParserDefinition { public static final IFileElementType PYTHON_REGEXP_FILE = new IFileElementType("PYTHON_REGEXP_FILE", PythonRegexpLanguage.INSTANCE); protected final EnumSet CAPABILITIES = EnumSet.of(RegExpCapability.DANGLING_METACHARACTERS, RegExpCapability.OCTAL_NO_LEADING_ZERO, - RegExpCapability.OMIT_NUMBERS_IN_QUANTIFIERS); + RegExpCapability.OMIT_NUMBERS_IN_QUANTIFIERS, + RegExpCapability.ALLOW_EMPTY_CHARACTER_CLASS); @NotNull public Lexer createLexer(Project project) {