1 /* 2 * Copyright (C) 2008 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #include <wtf/Platform.h> 27 28 #if ENABLE(WREC) 29 30 #include "WRECGenerator.h" 31 #include <wtf/unicode/Unicode.h> 32 33 namespace JSC { namespace WREC { 34 35 struct CharacterClass; 36 37 class GenerateAtomFunctor { 38 public: ~GenerateAtomFunctor()39 virtual ~GenerateAtomFunctor() {} 40 41 virtual void generateAtom(Generator*, Generator::JumpList&) = 0; 42 virtual void backtrack(Generator*) = 0; 43 }; 44 45 class GeneratePatternCharacterFunctor : public GenerateAtomFunctor { 46 public: GeneratePatternCharacterFunctor(const UChar ch)47 GeneratePatternCharacterFunctor(const UChar ch) 48 : m_ch(ch) 49 { 50 } 51 52 virtual void generateAtom(Generator*, Generator::JumpList&); 53 virtual void backtrack(Generator*); 54 55 private: 56 const UChar m_ch; 57 }; 58 59 class GenerateCharacterClassFunctor : public GenerateAtomFunctor { 60 public: GenerateCharacterClassFunctor(const CharacterClass * charClass,bool invert)61 GenerateCharacterClassFunctor(const CharacterClass* charClass, bool invert) 62 : m_charClass(charClass) 63 , m_invert(invert) 64 { 65 } 66 67 virtual void generateAtom(Generator*, Generator::JumpList&); 68 virtual void backtrack(Generator*); 69 70 private: 71 const CharacterClass* m_charClass; 72 bool m_invert; 73 }; 74 75 class GenerateBackreferenceFunctor : public GenerateAtomFunctor { 76 public: GenerateBackreferenceFunctor(unsigned subpatternId)77 GenerateBackreferenceFunctor(unsigned subpatternId) 78 : m_subpatternId(subpatternId) 79 { 80 } 81 82 virtual void generateAtom(Generator*, Generator::JumpList&); 83 virtual void backtrack(Generator*); 84 85 private: 86 unsigned m_subpatternId; 87 }; 88 89 class GenerateParenthesesNonGreedyFunctor : public GenerateAtomFunctor { 90 public: GenerateParenthesesNonGreedyFunctor(Generator::Label start,Generator::Jump success,Generator::Jump fail)91 GenerateParenthesesNonGreedyFunctor(Generator::Label start, Generator::Jump success, Generator::Jump fail) 92 : m_start(start) 93 , m_success(success) 94 , m_fail(fail) 95 { 96 } 97 98 virtual void generateAtom(Generator*, Generator::JumpList&); 99 virtual void backtrack(Generator*); 100 101 private: 102 Generator::Label m_start; 103 Generator::Jump m_success; 104 Generator::Jump m_fail; 105 }; 106 107 } } // namespace JSC::WREC 108 109 #endif // ENABLE(WREC) 110