summaryrefslogtreecommitdiff
path: root/RegExpSupport/src/org/intellij/lang/regexp/RegExpTT.java
blob: c9f9b9bb8a097a160bd53a26ea9115dbfe220360 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
 * Copyright 2006 Sascha Weinreuter
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.intellij.lang.regexp;

import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;
import com.intellij.psi.StringEscapesTokenTypes;

public interface RegExpTT {
    IElementType NUMBER = new RegExpElementType("NUMBER");
    IElementType NAME = new RegExpElementType("NAME");
    IElementType COMMA = new RegExpElementType("COMMA");

    // "\\Q"
    IElementType QUOTE_BEGIN = new RegExpElementType("QUOTE_BEGIN");
    // <QUOTE> "\\E"
    IElementType QUOTE_END = new RegExpElementType("QUOTE_END");

    // "\\" 0-9
    IElementType BACKREF = new RegExpElementType("BACKREF");

    IElementType LBRACE = new RegExpElementType("LBRACE");
    IElementType RBRACE = new RegExpElementType("RBRACE");

    IElementType CLASS_BEGIN = new RegExpElementType("CLASS_BEGIN");
    IElementType CLASS_END = new RegExpElementType("CLASS_END");
    IElementType ANDAND = new RegExpElementType("ANDAND");

    IElementType GROUP_BEGIN = new RegExpElementType("GROUP_BEGIN");
    IElementType GROUP_END = new RegExpElementType("GROUP_END");

    IElementType NON_CAPT_GROUP = new RegExpElementType("NON_CAPT_GROUP");
    IElementType POS_LOOKBEHIND = new RegExpElementType("POS_LOOKBEHIND");
    IElementType NEG_LOOKBEHIND = new RegExpElementType("NEG_LOOKBEHIND");
    IElementType POS_LOOKAHEAD = new RegExpElementType("POS_LOOKAHEAD");
    IElementType NEG_LOOKAHEAD = new RegExpElementType("NEG_LOOKAHEAD");
    IElementType SET_OPTIONS = new RegExpElementType("SET_OPTIONS");

    IElementType QUEST = new RegExpElementType("QUEST");
    IElementType STAR = new RegExpElementType("STAR");
    IElementType PLUS = new RegExpElementType("PLUS");
    IElementType COLON = new RegExpElementType("COLON");

    // "\\" ("b" | "B" | "A" | "z" | "Z" | "G")
    IElementType BOUNDARY = new RegExpElementType("BOUNDARY");
    // "^"
    IElementType CARET = new RegExpElementType("CARET");
    // "$"
    IElementType DOLLAR = new RegExpElementType("DOLLAR");

    IElementType DOT = new RegExpElementType("DOT");
    IElementType UNION = new RegExpElementType("UNION");

    // > in Python/Ruby named group
    IElementType GT = new RegExpElementType("GT");
    // ' in Ruby quoted named group
    IElementType QUOTE = new RegExpElementType("QUOTE");

    // "\b" | "\t" | "\f" | "\r" | "\n"
    IElementType CTRL_CHARACTER = new RegExpElementType("CTRL_CHARACTER");
    // "\\" ("t" | "n" | "r" | "f" | "a" | "e")
    IElementType ESC_CTRL_CHARACTER = new RegExpElementType("ESC_CTRL_CHARACTER");
    // "\\" ("." | "|" | "$" | "^" | "?" | "*" | "+" | "[" | "{" | "(" | ")")
    IElementType ESC_CHARACTER = new RegExpElementType("ESC_CHARACTER");
    // "\\" ("w" | "W" | "s" | "S" | "d" | "D")
    IElementType CHAR_CLASS = new RegExpElementType("CHAR_CLASS");
    // "\\u" XXXX
    IElementType UNICODE_CHAR = new RegExpElementType("UNICODE_CHAR");
    // "\\x" XX
    IElementType HEX_CHAR = new RegExpElementType("HEX_CHAR");
    // "\\0" OOO
    IElementType OCT_CHAR = new RegExpElementType("OCT_CHAR");
    // "\\c" x
    IElementType CTRL = new RegExpElementType("CTRL");
    // "\\p" | "\\P"
    IElementType PROPERTY = new RegExpElementType("PROPERTY");

    // e.g. "\\#" but also "\\q" which is not a valid escape actually
    IElementType REDUNDANT_ESCAPE = new RegExpElementType("REDUNDANT_ESCAPE");

    IElementType MINUS = new RegExpElementType("MINUS");
    IElementType CHARACTER = new RegExpElementType("CHARACTER");

    IElementType BAD_CHARACTER = new RegExpElementType("BAD_CHARACTER");
    IElementType BAD_OCT_VALUE = new RegExpElementType("BAD_OCT_VALUE");
    IElementType BAD_HEX_VALUE = new RegExpElementType("BAD_HEX_VALUE");

    IElementType COMMENT = new RegExpElementType("COMMENT");
    IElementType OPTIONS_ON = new RegExpElementType("OPTIONS_ON");
    IElementType OPTIONS_OFF = new RegExpElementType("OPTIONS_OFF");

    // (?P<name>...
    IElementType PYTHON_NAMED_GROUP = new RegExpElementType("PYTHON_NAMED_GROUP");
    // (?P=name)
    IElementType PYTHON_NAMED_GROUP_REF = new RegExpElementType("PYTHON_NAMED_GROUP_REF");
    // (?(id/name)yes-pattern|no-pattern)
    IElementType PYTHON_COND_REF = new RegExpElementType("PYTHON_COND_REF"); 
  
    // (?<name>...
    IElementType RUBY_NAMED_GROUP = new RegExpElementType("RUBY_NAMED_GROUP");

    // (?'name'...
    IElementType RUBY_QUOTED_NAMED_GROUP = new RegExpElementType("RUBY_QUOTED_NAMED_GROUP");

    TokenSet KEYWORDS = TokenSet.create(DOT, STAR, QUEST, PLUS);

    TokenSet CHARACTERS = TokenSet.create(CHARACTER,
            ESC_CTRL_CHARACTER,
            ESC_CHARACTER,
            CTRL_CHARACTER,
            CTRL,
            UNICODE_CHAR,
            HEX_CHAR, BAD_HEX_VALUE,
            OCT_CHAR, BAD_OCT_VALUE,
            REDUNDANT_ESCAPE,
            MINUS,
            StringEscapesTokenTypes.INVALID_UNICODE_ESCAPE_TOKEN,
            StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN);

    TokenSet SIMPLE_CLASSES = TokenSet.create(DOT, CHAR_CLASS);

    // caret is just a character in classes after the first position: [a^] matches "a" or "^"
    TokenSet CHARACTERS2 = TokenSet.orSet(CHARACTERS, SIMPLE_CLASSES, TokenSet.create(CARET, LBRACE));

    TokenSet QUANTIFIERS = TokenSet.create(QUEST, PLUS, STAR, LBRACE);

    TokenSet GROUPS = TokenSet.create(GROUP_BEGIN,
            NON_CAPT_GROUP,
            POS_LOOKAHEAD,
            NEG_LOOKAHEAD,
            POS_LOOKBEHIND,
            NEG_LOOKBEHIND);

    TokenSet BOUNDARIES = TokenSet.create(BOUNDARY, CARET, DOLLAR);
}