From 502929963cacfd644579050506bed123b9e32329 Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Thu, 4 Jul 2013 15:10:32 -0400 Subject: [PATCH] Added alternation and fixed a bug with the repetition operators exposed by the addition of the alternation. (for some reason the repetition operators used a loop making endless circles) --- src/RegEx.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/RegEx.cpp b/src/RegEx.cpp index 47a1e56..f1e93b1 100644 --- a/src/RegEx.cpp +++ b/src/RegEx.cpp @@ -11,9 +11,10 @@ RegEx::RegEx(std::string inPattern) { case '*': { std::cout << "Star at " << i << " in " << pattern << std::endl; - for (std::vector::size_type j = 0; j < currentStates.size(); j++) - for (std::vector::size_type k = 0; k < currentStates.size(); k++) - currentStates[j]->addNext(currentStates[k]); + // for (std::vector::size_type j = 0; j < currentStates.size(); j++) + // for (std::vector::size_type k = 0; k < currentStates.size(); k++) + // currentStates[j]->addNext(currentStates[k]); + currentStates[currentStates.size()-1]->addNext(currentStates[currentStates.size()-1]); //add all previous states to current states to enable skipping over the starred item currentStates.insert(currentStates.end(), previousStates.begin(), previousStates.end()); } @@ -23,9 +24,10 @@ RegEx::RegEx(std::string inPattern) { std::cout << "Plus at " << i << " in " << pattern << std::endl; //OtherThingy //current->addNext(current); - for (std::vector::size_type j = 0; j < currentStates.size(); j++) - for (std::vector::size_type k = 0; k < currentStates.size(); k++) - currentStates[j]->addNext(currentStates[k]); + // for (std::vector::size_type j = 0; j < currentStates.size(); j++) + // for (std::vector::size_type k = 0; k < currentStates.size(); k++) + // currentStates[j]->addNext(currentStates[k]); + currentStates[currentStates.size()-1]->addNext(currentStates[currentStates.size()-1]); } break; case '?': @@ -36,8 +38,16 @@ RegEx::RegEx(std::string inPattern) { } break; case '|': + { std::cout << "Alternation at " << i << " in " << pattern << std::endl; //alternation + i++; + RegExState* next = new RegExState(pattern[i]); + for (std::vector::size_type j = 0; j < previousStates.size(); j++) + previousStates[j]->addNext(next); + currentStates.push_back(next); + } + break; case '(': std::cout << "Begin peren at " << i << " in " << pattern << std::endl;