123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- /*
- * 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
|