Changed from iterators, which become invalidated if vector is changed, to classic indexing. Now runs! However, the results are incorrect. Closure seems to work through.

This commit is contained in:
Nathan Braswell
2013-05-24 13:24:33 -04:00
parent 1aec4ee6a7
commit 858daa30ee
2 changed files with 34 additions and 22 deletions

View File

@@ -41,8 +41,12 @@ int main(int argc, char* argv[]) {
Parser parser; Parser parser;
parser.loadGrammer(inputFileString); parser.loadGrammer(inputFileString);
std::cout << "Creating State Set from Main" << std::endl;
parser.createStateSet(); parser.createStateSet();
std::cout << "finished State Set from Main" << std::endl;
std::cout << "Doing stateSetToString from Main" << std::endl;
std::cout << parser.stateSetToString() << std::endl; std::cout << parser.stateSetToString() << std::endl;
std::cout << "finished stateSetToString from Main" << std::endl;
std::cout << inputFileString << std::endl; std::cout << inputFileString << std::endl;
std::cout << parser.grammerToString() << std::endl; std::cout << parser.grammerToString() << std::endl;

View File

@@ -58,12 +58,19 @@ void Parser::loadGrammer(std::string grammerInputString) {
} }
void Parser::createStateSet() { void Parser::createStateSet() {
std::cout << "Begining creation of stateSet" << std::endl;
stateSets.push_back( new std::vector<ParseRule*> ); stateSets.push_back( new std::vector<ParseRule*> );
stateSets[0]->push_back(loadedGrammer[0]); stateSets[0]->push_back(loadedGrammer[0]);
for (std::vector< std::vector<ParseRule*>* >::iterator i = stateSets.begin(); i != stateSets.end(); i++) { std::cout << "Begining for main set for loop" << std::endl;
closure(*i); for (std::vector< std::vector<ParseRule*>* >::size_type i = 0; i < stateSets.size(); i++) {
for (std::vector<ParseRule*>::iterator j = (*i)->begin(); j != (*i)->end(); j++) { std::cout << "calling closure" << std::endl;
addState(&stateSets, *i, (*j)->getRightSide()[(*j)->getIndex()]); closure(stateSets[i]);
std::cout << "finished closure" << std::endl;
std::cout << "Starting inner for loop that adds states" << std::endl;
for (std::vector<ParseRule*>::size_type j = 0; j < stateSets[i]->size(); j++) {
std::cout << "about to call addState" << std::endl;
addState(&stateSets, stateSets[i], (*stateSets[i])[j]->getRightSide()[(*stateSets[i])[j]->getIndex()]);
std::cout << "finished addState" << std::endl;
//Closure will be called in the outer loop //Closure will be called in the outer loop
} }
} }
@@ -71,19 +78,19 @@ void Parser::createStateSet() {
void Parser::closure(std::vector<ParseRule*>* state) { void Parser::closure(std::vector<ParseRule*>* state) {
//Add all the applicable rules. //Add all the applicable rules.
for (std::vector<ParseRule*>::iterator i = state->begin(); i != state->end(); i++) { for (std::vector<ParseRule*>::size_type i = 0; i < state->size(); i++) {
for (std::vector<ParseRule*>::iterator j = loadedGrammer.begin(); j != loadedGrammer.end(); j++) { for (std::vector<ParseRule*>::size_type j = 0; j < loadedGrammer.size(); j++) {
if ((*i)->getRightSide()[(*i)->getIndex()] == (*j)->getLeftSide()) { if ((*state)[i]->getRightSide()[(*state)[i]->getIndex()] == loadedGrammer[j]->getLeftSide()) {
//Check to make sure not already in //Check to make sure not already in
bool isAlreadyInState = false; bool isAlreadyInState = false;
for (std::vector<ParseRule*>::iterator k = state->begin(); k != state->end(); k++) { for (std::vector<ParseRule*>::size_type k = 0; k < state->size(); k++) {
if ((*k) == (*i)) { if ((*state)[k] == loadedGrammer[j]) {
isAlreadyInState = true; isAlreadyInState = true;
break; break;
} }
} }
if (!isAlreadyInState) if (!isAlreadyInState)
state->push_back(*j); state->push_back(loadedGrammer[j]);
} }
} }
} }
@@ -93,26 +100,26 @@ void Parser::closure(std::vector<ParseRule*>* state) {
void Parser::addState(std::vector< std::vector<ParseRule*>* >* stateSets, std::vector<ParseRule*>* state, Symbol* symbol) { void Parser::addState(std::vector< std::vector<ParseRule*>* >* stateSets, std::vector<ParseRule*>* state, Symbol* symbol) {
std::vector<std::vector<ParseRule*>* > newStates; std::vector<std::vector<ParseRule*>* > newStates;
//For each rule in the state we already have //For each rule in the state we already have
for (std::vector<ParseRule*>::iterator i = state->begin(); i != state->end(); i++) { for (std::vector<ParseRule*>::size_type i = 0; i < state->size(); i++) {
//Clone the current rule //Clone the current rule
ParseRule* advancedRule = (*i)->clone(); ParseRule* advancedRule = (*state)[i]->clone();
//Try to advance the pointer //Try to advance the pointer
if (advancedRule->advancePointer()) { if (advancedRule->advancePointer()) {
//If sucessful, check to see if this the advanced symbol is the basis for any of our new states //If sucessful, check to see if this the advanced symbol is the basis for any of our new states
bool symbolAlreadyInState = false; bool symbolAlreadyInState = false;
for (std::vector<std::vector<ParseRule*>* >::iterator j = newStates.begin(); j != newStates.end(); j++) { for (std::vector<std::vector<ParseRule*>* >::size_type j = 0; j < newStates.size(); j++) {
if ((**j)[0]->getRightSide()[(**j)[0]->getIndex()] == advancedRule->getRightSide()[advancedRule->getIndex()]) { if ((*newStates[j])[0]->getRightSide()[(*newStates[j])[0]->getIndex()] == advancedRule->getRightSide()[advancedRule->getIndex()]) {
symbolAlreadyInState = true; symbolAlreadyInState = true;
//So now check to see if this exact rule is in this state //So now check to see if this exact rule is in this state
bool ruleAlreadyInState = false; bool ruleAlreadyInState = false;
for (std::vector<ParseRule*>::iterator k = (*j)->begin(); k != (*j)->end(); k++) { for (std::vector<ParseRule*>::size_type k = 0; k < newStates[j]->size(); k++) {
if (*(*k) == (*advancedRule) ) { if (*(*newStates[j])[k] == (*advancedRule) ) {
ruleAlreadyInState = true; ruleAlreadyInState = true;
break; break;
} }
} }
if (!ruleAlreadyInState) { if (!ruleAlreadyInState) {
(*j)->push_back(advancedRule); newStates[j]->push_back(advancedRule);
} }
//We found a state with the same symbol, so stop searching //We found a state with the same symbol, so stop searching
break; break;
@@ -126,20 +133,21 @@ void Parser::addState(std::vector< std::vector<ParseRule*>* >* stateSets, std::v
} }
} }
//Put all our new states in the set of states //Put all our new states in the set of states
for (std::vector< std::vector<ParseRule*> * >::iterator i = newStates.begin(); i != newStates.end(); i++) { for (std::vector< std::vector<ParseRule*> * >::size_type i = 0; i < newStates.size(); i++) {
stateSets->push_back((*i)); stateSets->push_back(newStates[i]);
} }
} }
std::string Parser::stateSetToString() { std::string Parser::stateSetToString() {
std::string concat = ""; std::string concat = "";
int currentNum = 0; int currentNum = 0;
for (std::vector< std::vector<ParseRule*> *>::iterator i = stateSets.begin(); i != stateSets.end(); i++) { for (std::vector< std::vector<ParseRule*> *>::size_type i = 0; i < stateSets.size(); i++) {
concat += "State " + intToString(currentNum) + ":\n"; concat += "State " + intToString(currentNum) + ":\n";
for (std::vector<ParseRule*>::iterator j = (*i)->begin(); j != (*i)->end(); j++) { for (std::vector<ParseRule*>::size_type j = 0; j < stateSets[i]->size(); j++) {
concat += "\t" + (*j)->toString() + "\n"; concat += "\t" + (*stateSets[i])[j]->toString() + "\n";
} }
concat += "\n"; concat += "\n";
currentNum++;
} }
return concat; return concat;
} }