1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2017 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/lex/NFA.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/lex/LexUtil.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include <string> 12*c8dee2aaSAndroid Build Coastguard Worker match(std::string s) const13*c8dee2aaSAndroid Build Coastguard Workerint NFA::match(std::string s) const { 14*c8dee2aaSAndroid Build Coastguard Worker std::vector<int> states = fStartStates; 15*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < s.size(); ++i) { 16*c8dee2aaSAndroid Build Coastguard Worker std::vector<int> next; 17*c8dee2aaSAndroid Build Coastguard Worker for (int id : states) { 18*c8dee2aaSAndroid Build Coastguard Worker if (fStates[id].accept(s[i])) { 19*c8dee2aaSAndroid Build Coastguard Worker for (int nextId : fStates[id].fNext) { 20*c8dee2aaSAndroid Build Coastguard Worker if (fStates[nextId].fKind != NFAState::kRemapped_Kind) { 21*c8dee2aaSAndroid Build Coastguard Worker next.push_back(nextId); 22*c8dee2aaSAndroid Build Coastguard Worker } else { 23*c8dee2aaSAndroid Build Coastguard Worker next.insert(next.end(), fStates[nextId].fData.begin(), 24*c8dee2aaSAndroid Build Coastguard Worker fStates[nextId].fData.end()); 25*c8dee2aaSAndroid Build Coastguard Worker } 26*c8dee2aaSAndroid Build Coastguard Worker } 27*c8dee2aaSAndroid Build Coastguard Worker } 28*c8dee2aaSAndroid Build Coastguard Worker } 29*c8dee2aaSAndroid Build Coastguard Worker if (!next.size()) { 30*c8dee2aaSAndroid Build Coastguard Worker return INVALID; 31*c8dee2aaSAndroid Build Coastguard Worker } 32*c8dee2aaSAndroid Build Coastguard Worker states = next; 33*c8dee2aaSAndroid Build Coastguard Worker } 34*c8dee2aaSAndroid Build Coastguard Worker int accept = INVALID; 35*c8dee2aaSAndroid Build Coastguard Worker for (int id : states) { 36*c8dee2aaSAndroid Build Coastguard Worker if (fStates[id].fKind == NFAState::kAccept_Kind) { 37*c8dee2aaSAndroid Build Coastguard Worker int result = fStates[id].fData[0]; 38*c8dee2aaSAndroid Build Coastguard Worker if (accept == INVALID || result < accept) { 39*c8dee2aaSAndroid Build Coastguard Worker accept = result; 40*c8dee2aaSAndroid Build Coastguard Worker } 41*c8dee2aaSAndroid Build Coastguard Worker } 42*c8dee2aaSAndroid Build Coastguard Worker } 43*c8dee2aaSAndroid Build Coastguard Worker return accept; 44*c8dee2aaSAndroid Build Coastguard Worker } 45