/*
* Copyright 2017 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SKSL_REGEXNODE
#define SKSL_REGEXNODE
#include <string>
#include <vector>
struct NFA;
/**
* Represents a node in the parse tree of a regular expression.
*/
struct RegexNode {
enum Kind {
kChar_Kind,
kCharset_Kind,
kConcat_Kind,
kDot_Kind,
kOr_Kind,
kPlus_Kind,
kRange_Kind,
kQuestion_Kind,
kStar_Kind
};
RegexNode(Kind kind)
: fKind(kind) {}
RegexNode(Kind kind, char payload)
: fKind(kind) {
fPayload.fChar = payload;
}
RegexNode(Kind kind, const char* children)
: fKind(kind) {
fPayload.fBool = false;
while (*children != '\0') {
fChildren.emplace_back(kChar_Kind, *children);
++children;
}
}
RegexNode(Kind kind, RegexNode child)
: fKind(kind) {
fChildren.push_back(std::move(child));
}
RegexNode(Kind kind, RegexNode child1, RegexNode child2)
: fKind(kind) {
fChildren.push_back(std::move(child1));
fChildren.push_back(std::move(child2));
}
/**
* Creates NFA states for this node, with a successful match against this node resulting in a
* transition to all of the states in the accept vector.
*/
std::vector<int> createStates(NFA* nfa, const std::vector<int>& accept) const;
std::string description() const;
Kind fKind;
union Payload {
char fChar;
bool fBool;
} fPayload;
std::vector<RegexNode> fChildren;
};
#endif