4 // Copyright (C) 2002-2012, International Business Machines Corporation and others.
5 // All Rights Reserved.
7 // This file contains declarations for the class RegexCompile
9 // This class is internal to the regular expression implementation.
10 // For the public Regular Expression API, see the file "unicode/regex.h"
17 #include "unicode/utypes.h"
18 #if !UCONFIG_NO_REGULAR_EXPRESSIONS
20 #include "unicode/uobject.h"
21 #include "unicode/uniset.h"
22 #include "unicode/parseerr.h"
31 //--------------------------------------------------------------------------------
33 // class RegexCompile Contains the regular expression compiler.
35 //--------------------------------------------------------------------------------
40 class RegexCompile : public UMemory {
44 kStackSize = 100 // The size of the state stack for
45 }; // pattern parsing. Corresponds roughly
46 // to the depth of parentheses nesting
47 // that is allowed in the rules.
49 struct RegexPatternChar {
54 RegexCompile(RegexPattern *rp, UErrorCode &e);
56 void compile(const UnicodeString &pat, UParseError &pp, UErrorCode &e);
57 void compile(UText *pat, UParseError &pp, UErrorCode &e);
60 virtual ~RegexCompile();
62 void nextChar(RegexPatternChar &c); // Get the next char from the input stream.
64 static void cleanup(); // Memory cleanup
68 // Categories of parentheses in pattern.
69 // The category is saved in the compile-time parentheses stack frame, and
70 // determines the code to be generated when the matching close ) is encountered.
72 plain = -1, // No special handling
85 UBool doParseActions(int32_t a);
86 void error(UErrorCode e); // error reporting convenience function.
90 UnicodeSet *scanProp();
91 UnicodeSet *scanPosixProp();
92 void handleCloseParen();
93 int32_t blockTopLoc(UBool reserve); // Locate a position in the compiled pattern
94 // at the top of the just completed block
95 // or operation, and optionally ensure that
96 // there is space to add an opcode there.
97 void compileSet(UnicodeSet *theSet); // Generate the compiled pattern for
98 // a reference to a UnicodeSet.
99 void compileInterval(int32_t InitOp, // Generate the code for a {min,max} quantifier.
101 UBool compileInlineInterval(); // Generate inline code for a {min,max} quantifier
102 void literalChar(UChar32 c); // Compile a literal char
103 void fixLiterals(UBool split=FALSE); // Generate code for pending literal characters.
104 void insertOp(int32_t where); // Open up a slot for a new op in the
105 // generated code at the specified location.
106 void appendOp(int32_t op); // Append a new op to the compiled pattern.
107 int32_t allocateData(int32_t size); // Allocate space in the matcher data area.
108 // Return index of the newly allocated data.
109 int32_t allocateStackData(int32_t size); // Allocate space in the match back-track stack frame.
110 // Return offset index in the frame.
111 int32_t minMatchLength(int32_t start,
113 int32_t maxMatchLength(int32_t start,
115 void matchStartType();
118 void setEval(int32_t op);
119 void setPushOp(int32_t op);
120 UChar32 scanNamedChar();
121 UnicodeSet *createSetForProperty(const UnicodeString &propName, UBool negated);
125 RegexPattern *fRXPat;
126 UParseError *fParseErr;
129 // Data associated with low level character scanning
131 int64_t fScanIndex; // Index of current character being processed
132 // in the rule input string.
133 UBool fQuoteMode; // Scan is in a \Q...\E quoted region
134 UBool fInBackslashQuote; // Scan is between a '\' and the following char.
135 UBool fEOLComments; // When scan is just after '(?', inhibit #... to
136 // end of line comments, in favor of (?#...) comments.
137 int64_t fLineNum; // Line number in input file.
138 int64_t fCharNum; // Char position within the line.
139 UChar32 fLastChar; // Previous char, needed to count CR-LF
140 // as a single line, not two.
141 UChar32 fPeekChar; // Saved char, if we've scanned ahead.
144 RegexPatternChar fC; // Current char for parse state machine
148 // Data for the state machine that parses the regular expression.
150 RegexTableEl **fStateTable; // State Transition Table for regex Rule
151 // parsing. index by p[state][char-class]
153 uint16_t fStack[kStackSize]; // State stack, holds state pushes
154 int32_t fStackPtr; // and pops as specified in the state
158 // Data associated with the generation of the pcode for the match engine
160 int32_t fModeFlags; // Match Flags. (Case Insensitive, etc.)
161 // Always has high bit (31) set so that flag values
162 // on the paren stack are distinguished from relocatable
164 int32_t fNewModeFlags; // New flags, while compiling (?i, holds state
165 // until last flag is scanned.
166 UBool fSetModeFlag; // true for (?ismx, false for (?-ismx
168 UnicodeString fLiteralChars; // Literal chars or strings from the pattern are accumulated here.
169 // Once completed, meaning that some non-literal pattern
170 // construct is encountered, the appropriate opcodes
171 // to match the literal will be generated, and this
172 // string will be cleared.
174 int64_t fPatternLength; // Length of the input pattern string.
176 UVector32 fParenStack; // parentheses stack. Each frame consists of
177 // the positions of compiled pattern operations
178 // needing fixup, followed by negative value. The
179 // first entry in each frame is the position of the
180 // spot reserved for use when a quantifier
181 // needs to add a SAVE at the start of a (block)
182 // The negative value (-1, -2,...) indicates
183 // the kind of paren that opened the frame. Some
184 // need special handling on close.
187 int32_t fMatchOpenParen; // The position in the compiled pattern
188 // of the slot reserved for a state save
189 // at the start of the most recently processed
190 // parenthesized block. Updated when processing
191 // a close to the location for the corresponding open.
193 int32_t fMatchCloseParen; // The position in the pattern of the first
194 // location after the most recently processed
195 // parenthesized block.
197 int32_t fIntervalLow; // {lower, upper} interval quantifier values.
198 int32_t fIntervalUpper; // Placed here temporarily, when pattern is
199 // initially scanned. Each new interval
200 // encountered overwrites these values.
201 // -1 for the upper interval value means none
202 // was specified (unlimited occurences.)
204 int64_t fNameStartPos; // Starting position of a \N{NAME} name in a
205 // pattern, valid while remainder of name is
208 UStack fSetStack; // Stack of UnicodeSets, used while evaluating
209 // (at compile time) set expressions within
211 UStack fSetOpStack; // Stack of pending set operators (&&, --, union)
213 UChar32 fLastSetLiteral; // The last single code point added to a set.
214 // needed when "-y" is scanned, and we need
215 // to turn "x-y" into a range.
218 // Constant values to be pushed onto fSetOpStack while scanning & evalueating [set expressions]
219 // The high 16 bits are the operator precedence, and the low 16 are a code for the operation itself.
222 setStart = 0 << 16 | 1,
223 setEnd = 1 << 16 | 2,
224 setNegation = 2 << 16 | 3,
225 setCaseClose = 2 << 16 | 9,
226 setDifference2 = 3 << 16 | 4, // '--' set difference operator
227 setIntersection2 = 3 << 16 | 5, // '&&' set intersection operator
228 setUnion = 4 << 16 | 6, // implicit union of adjacent items
229 setDifference1 = 4 << 16 | 7, // '-', single dash difference op, for compatibility with old UnicodeSet.
230 setIntersection1 = 4 << 16 | 8 // '&', single amp intersection op, for compatibility with old UnicodeSet.
234 #endif // !UCONFIG_NO_REGULAR_EXPRESSIONS