195 Stack<Allocator> operandStack(
allocator_, 256);
196 Stack<Allocator> operatorStack(
allocator_, 256);
197 Stack<Allocator> atomCountStack(
allocator_, 256);
199 *atomCountStack.template Push<unsigned>() = 0;
202 while (ds.Peek() != 0) {
203 switch (codepoint = ds.Take()) {
213 while (!operatorStack.Empty() && *operatorStack.template Top<Operator>() <
kAlternation)
214 if (!
Eval(operandStack, *operatorStack.template Pop<Operator>(1)))
216 *operatorStack.template Push<Operator>() =
kAlternation;
217 *atomCountStack.template Top<unsigned>() = 0;
222 *atomCountStack.template Push<unsigned>() = 0;
226 while (!operatorStack.Empty() && *operatorStack.template Top<Operator>() !=
kLeftParenthesis)
227 if (!
Eval(operandStack, *operatorStack.template Pop<Operator>(1)))
229 if (operatorStack.Empty())
231 operatorStack.template Pop<Operator>(1);
232 atomCountStack.template Pop<unsigned>(1);
257 if (ds.Peek() ==
',') {
259 if (ds.Peek() ==
'}')
285 *operandStack.template Push<Frag>() = Frag(s, s, s);
301 while (!operatorStack.Empty())
302 if (!
Eval(operandStack, *operatorStack.template Pop<Operator>(1)))
306 if (operandStack.GetSize() ==
sizeof(Frag)) {
307 Frag* e = operandStack.template Pop<Frag>(1);
311 #if RAPIDJSON_REGEX_VERBOSE 312 printf(
"root: %d\n",
root_);
315 printf(
"[%2d] out: %2d out1: %2d c: '%c'\n", i, s.out, s.out1, (
char)s.codepoint);
RAPIDJSON_NAMESPACE_BEGIN typedef unsigned SizeType
Size type (for string lengths, array sizes, etc.)
bool ParseRange(DecodedStream< InputStream, Encoding > &ds, SizeType *range)
static const unsigned kInfinityQuantifier
bool CharacterEscape(DecodedStream< InputStream, Encoding > &ds, unsigned *escapedCodepoint)
bool EvalQuantifier(Stack< Allocator > &operandStack, unsigned n, unsigned m)
SizeType NewState(SizeType out, SizeType out1, unsigned codepoint)
void Patch(SizeType l, SizeType s)
bool Eval(Stack< Allocator > &operandStack, Operator op)
static const SizeType kRegexInvalidState
Represents an invalid index in GenericRegex::State::out, out1.
bool ParseUnsigned(DecodedStream< InputStream, Encoding > &ds, unsigned *u)
static const unsigned kAnyCharacterClass
For '.'.
State & GetState(SizeType index)
static const unsigned kRangeCharacterClass
void ImplicitConcatenation(Stack< Allocator > &atomCountStack, Stack< Allocator > &operatorStack)
void PushOperand(Stack< Allocator > &operandStack, unsigned codepoint)