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:
4
main.cpp
4
main.cpp
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user