Home | History | Annotate | Download | only in lex
      1 /*
      2  * Copyright 2017 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef SKSL_REGEXNODE
      9 #define SKSL_REGEXNODE
     10 
     11 #include <string>
     12 #include <vector>
     13 
     14 struct NFA;
     15 
     16 /**
     17  * Represents a node in the parse tree of a regular expression.
     18  */
     19 struct RegexNode {
     20     enum Kind {
     21         kChar_Kind,
     22         kCharset_Kind,
     23         kConcat_Kind,
     24         kDot_Kind,
     25         kOr_Kind,
     26         kPlus_Kind,
     27         kRange_Kind,
     28         kQuestion_Kind,
     29         kStar_Kind
     30     };
     31 
     32     RegexNode(Kind kind)
     33     : fKind(kind) {}
     34 
     35     RegexNode(Kind kind, char payload)
     36     : fKind(kind) {
     37         fPayload.fChar = payload;
     38     }
     39 
     40     RegexNode(Kind kind, const char* children)
     41     : fKind(kind) {
     42         fPayload.fBool = false;
     43         while (*children != '\0') {
     44             fChildren.emplace_back(kChar_Kind, *children);
     45             ++children;
     46         }
     47     }
     48 
     49     RegexNode(Kind kind, RegexNode child)
     50     : fKind(kind) {
     51         fChildren.push_back(std::move(child));
     52     }
     53 
     54     RegexNode(Kind kind, RegexNode child1, RegexNode child2)
     55     : fKind(kind) {
     56         fChildren.push_back(std::move(child1));
     57         fChildren.push_back(std::move(child2));
     58     }
     59 
     60     /**
     61      * Creates NFA states for this node, with a successful match against this node resulting in a
     62      * transition to all of the states in the accept vector.
     63      */
     64     std::vector<int> createStates(NFA* nfa, const std::vector<int>& accept) const;
     65 
     66     std::string description() const;
     67 
     68     Kind fKind;
     69 
     70     union Payload {
     71         char fChar;
     72         bool fBool;
     73     } fPayload;
     74 
     75     std::vector<RegexNode> fChildren;
     76 };
     77 
     78 #endif
     79