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