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