1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2016 The Qt Company Ltd. 4 ** Contact: https://www.qt.io/licensing/ 5 ** 6 ** This file is part of the utils of the Qt Toolkit. 7 ** 8 ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ 9 ** Commercial License Usage 10 ** Licensees holding valid commercial Qt licenses may use this file in 11 ** accordance with the commercial license agreement provided with the 12 ** Software or, alternatively, in accordance with the terms contained in 13 ** a written agreement between you and The Qt Company. For licensing terms 14 ** and conditions see https://www.qt.io/terms-conditions. For further 15 ** information use the contact form at https://www.qt.io/contact-us. 16 ** 17 ** GNU General Public License Usage 18 ** Alternatively, this file may be used under the terms of the GNU 19 ** General Public License version 3 as published by the Free Software 20 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT 21 ** included in the packaging of this file. Please review the following 22 ** information to ensure the GNU General Public License requirements will 23 ** be met: https://www.gnu.org/licenses/gpl-3.0.html. 24 ** 25 ** $QT_END_LICENSE$ 26 ** 27 ****************************************************************************/ 28 29 #ifndef RE2NFA_H 30 #define RE2NFA_H 31 32 #include "nfa.h" 33 #include <QSet> 34 35 class RE2NFA 36 { 37 public: 38 RE2NFA(const QMap<QString, NFA> ¯os, const QSet<InputType> &maxInputSet, Qt::CaseSensitivity cs); 39 40 NFA parse(const QString &expression, int *errorColumn = 0); 41 42 private: 43 NFA parseExpr(); 44 NFA parseBranch(); 45 NFA parsePiece(); 46 NFA parseAtom(); 47 NFA parseMaybeQuantifier(const NFA &nfa); 48 NFA parseSet(); 49 NFA parseSet2(); 50 51 NFA createCharNFA(); 52 53 private: 54 friend class RegExpTokenizer; 55 56 enum Token { 57 TOK_INVALID, 58 TOK_STRING, 59 TOK_LBRACE, // { 60 TOK_RBRACE, // } 61 TOK_LBRACKET, // [ 62 TOK_RBRACKET, // ] 63 TOK_LPAREN, // ( 64 TOK_RPAREN, // ) 65 TOK_COMMA, 66 TOK_STAR, 67 TOK_OR, 68 TOK_QUESTION, 69 TOK_DOT, 70 TOK_PLUS, 71 TOK_SEQUENCE, 72 TOK_QUOTED_STRING 73 }; 74 75 struct Symbol 76 { SymbolSymbol77 inline Symbol() : token(TOK_INVALID), column(-1) {} tokenSymbol78 inline Symbol(Token t, const QString &l = QString()) : token(t), lexem(l), column(-1) {} 79 Token token; 80 QString lexem; 81 int column; 82 }; 83 hasNext()84 inline bool hasNext() const { return index < symbols.count(); } next()85 inline Token next() { return symbols.at(index++).token; } 86 bool next(Token t); 87 bool test(Token t); prev()88 inline void prev() { index--; } symbol()89 inline const Symbol &symbol() const { return symbols.at(index - 1); } 90 QString lexemUntil(Token t); 91 92 void tokenize(const QString &input); 93 94 QMap<QString, NFA> macros; 95 QVector<Symbol> symbols; 96 int index; 97 int errorColumn; 98 const QSet<InputType> maxInputSet; 99 Qt::CaseSensitivity caseSensitivity; 100 }; 101 102 #endif // RE2NFA_H 103 104