• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_REGEXPARSER
9 #define SKSL_REGEXPARSER
10 
11 #include "src/sksl/lex/RegexNode.h"
12 
13 #include <stack>
14 #include <string>
15 
16 /**
17  * Turns a simple regular expression into a parse tree. The regular expression syntax supports only
18  * the basic quantifiers ('*', '+', and '?'), alternation ('|'), character sets ('[a-z]'), and
19  * groups ('()').
20  */
21 class RegexParser {
22 public:
23     RegexNode parse(std::string source);
24 
25 private:
26     inline static constexpr char END = '\0';
27 
28     char peek();
29 
30     void expect(char c);
31 
32     RegexNode pop();
33 
34     /**
35      * Matches a char literal, parenthesized group, character set, or dot ('.').
36      */
37     void term();
38 
39     /**
40      * Matches a term followed by an optional quantifier ('*', '+', or '?').
41      */
42     void quantifiedTerm();
43 
44     /**
45      * Matches a sequence of quantifiedTerms.
46      */
47     void sequence();
48 
49     /**
50      * Returns a node representing the given escape character (e.g. escapeSequence('n') returns a
51      * node which matches a newline character).
52      */
53     RegexNode escapeSequence(char c);
54 
55     /**
56      * Matches a literal character or escape sequence.
57      */
58     void literal();
59 
60     /**
61      * Matches a dot ('.').
62      */
63     void dot();
64 
65     /**
66      * Matches a parenthesized group.
67      */
68     void group();
69 
70     /**
71      * Matches a literal character, escape sequence, or character range from a character set.
72      */
73     void setItem();
74 
75     /**
76      * Matches a character set.
77      */
78     void set();
79 
80     void regex();
81 
82     std::string fSource;
83 
84     size_t fIndex;
85 
86     std::stack<RegexNode> fStack;
87 };
88 
89 #endif
90