4
// Copyright (C) 2002-2010, 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); // Fix literal strings.
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 emitONE_CHAR(UChar32 c); // Emit a ONE_CHAR op into the compiled code,
107
// taking case mode into account.
108
int32_t minMatchLength(int32_t start,
110
int32_t maxMatchLength(int32_t start,
112
void matchStartType();
115
void setEval(int32_t op);
116
void setPushOp(int32_t op);
117
UChar32 scanNamedChar();
118
UnicodeSet *createSetForProperty(const UnicodeString &propName, UBool negated);
122
RegexPattern *fRXPat;
123
UParseError *fParseErr;
126
// Data associated with low level character scanning
128
int64_t fScanIndex; // Index of current character being processed
129
// in the rule input string.
130
UBool fQuoteMode; // Scan is in a \Q...\E quoted region
131
UBool fInBackslashQuote; // Scan is between a '\' and the following char.
132
UBool fEOLComments; // When scan is just after '(?', inhibit #... to
133
// end of line comments, in favor of (?#...) comments.
134
int64_t fLineNum; // Line number in input file.
135
int64_t fCharNum; // Char position within the line.
136
UChar32 fLastChar; // Previous char, needed to count CR-LF
137
// as a single line, not two.
138
UChar32 fPeekChar; // Saved char, if we've scanned ahead.
141
RegexPatternChar fC; // Current char for parse state machine
145
// Data for the state machine that parses the regular expression.
147
RegexTableEl **fStateTable; // State Transition Table for regex Rule
148
// parsing. index by p[state][char-class]
150
uint16_t fStack[kStackSize]; // State stack, holds state pushes
151
int32_t fStackPtr; // and pops as specified in the state
155
// Data associated with the generation of the pcode for the match engine
157
int32_t fModeFlags; // Match Flags. (Case Insensitive, etc.)
158
// Always has high bit (31) set so that flag values
159
// on the paren stack are distinguished from relocatable
161
int32_t fNewModeFlags; // New flags, while compiling (?i, holds state
162
// until last flag is scanned.
163
UBool fSetModeFlag; // true for (?ismx, false for (?-ismx
166
int32_t fStringOpStart; // While a literal string is being scanned
167
// holds the start index within RegexPattern.
168
// fLiteralText where the string is being stored.
170
int64_t fPatternLength; // Length of the input pattern string.
172
UVector32 fParenStack; // parentheses stack. Each frame consists of
173
// the positions of compiled pattern operations
174
// needing fixup, followed by negative value. The
175
// first entry in each frame is the position of the
176
// spot reserved for use when a quantifier
177
// needs to add a SAVE at the start of a (block)
178
// The negative value (-1, -2,...) indicates
179
// the kind of paren that opened the frame. Some
180
// need special handling on close.
183
int32_t fMatchOpenParen; // The position in the compiled pattern
184
// of the slot reserved for a state save
185
// at the start of the most recently processed
186
// parenthesized block.
187
int32_t fMatchCloseParen; // The position in the pattern of the first
188
// location after the most recently processed
189
// parenthesized block.
191
int32_t fIntervalLow; // {lower, upper} interval quantifier values.
192
int32_t fIntervalUpper; // Placed here temporarily, when pattern is
193
// initially scanned. Each new interval
194
// encountered overwrites these values.
195
// -1 for the upper interval value means none
196
// was specified (unlimited occurences.)
198
int64_t fNameStartPos; // Starting position of a \N{NAME} name in a
199
// pattern, valid while remainder of name is
202
UStack fSetStack; // Stack of UnicodeSets, used while evaluating
203
// (at compile time) set expressions within
205
UStack fSetOpStack; // Stack of pending set operators (&&, --, union)
207
UChar32 fLastSetLiteral; // The last single code point added to a set.
208
// needed when "-y" is scanned, and we need
209
// to turn "x-y" into a range.
212
// Constant values to be pushed onto fSetOpStack while scanning & evalueating [set expressions]
213
// The high 16 bits are the operator precedence, and the low 16 are a code for the operation itself.
216
setStart = 0 << 16 | 1,
217
setEnd = 1 << 16 | 2,
218
setNegation = 2 << 16 | 3,
219
setCaseClose = 2 << 16 | 9,
220
setDifference2 = 3 << 16 | 4, // '--' set difference operator
221
setIntersection2 = 3 << 16 | 5, // '&&' set intersection operator
222
setUnion = 4 << 16 | 6, // implicit union of adjacent items
223
setDifference1 = 4 << 16 | 7, // '-', single dash difference op, for compatibility with old UnicodeSet.
224
setIntersection1 = 4 << 16 | 8 // '&', single amp intersection op, for compatibility with old UnicodeSet.
228
#endif // !UCONFIG_NO_REGULAR_EXPRESSIONS