From 14fc410e00997f17b7da6b80e53d210cf1b3d0a2 Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Mon, 20 May 2013 23:26:15 -0400 Subject: [PATCH] Added clone method and pointer location to toString in ParseRule --- include/ParseRule.h | 5 +++++ src/ParseRule.cpp | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/ParseRule.h b/include/ParseRule.h index 368ca0a..4cc0289 100644 --- a/include/ParseRule.h +++ b/include/ParseRule.h @@ -14,11 +14,16 @@ class ParseRule { public: ParseRule(); + ParseRule(Symbol* leftHandle, int pointerIndex, std::vector &rightSide); ~ParseRule(); + ParseRule* clone(); + void setLeftHandle(Symbol* leftHandle); void appendToRight(Symbol* appendee); + bool advancePointer(); + std::string toString(); std::string toDOT(); diff --git a/src/ParseRule.cpp b/src/ParseRule.cpp index a620289..14c4d40 100644 --- a/src/ParseRule.cpp +++ b/src/ParseRule.cpp @@ -5,10 +5,20 @@ ParseRule::ParseRule() { leftHandle = NULL; } +ParseRule::ParseRule(Symbol* leftHandle, int pointerIndex, std::vector &rightSide) { + this->leftHandle = leftHandle; + this->pointerIndex = pointerIndex; + this->rightSide = rightSide; +} + ParseRule::~ParseRule() { } +ParseRule* ParseRule::clone() { + return( new ParseRule(leftHandle, pointerIndex, rightSide) ); +} + void ParseRule::setLeftHandle(Symbol* leftHandle) { this->leftHandle = leftHandle; } @@ -17,11 +27,23 @@ void ParseRule::appendToRight(Symbol* appendee) { rightSide.push_back(appendee); } +bool ParseRule::advancePointer() { + if (pointerIndex < rightSide.size()) { + pointerIndex++; + return true; + } + return false; +} + std::string ParseRule::toString() { std::string concat = leftHandle->toString() + " -> "; for (int i = 0; i < rightSide.size(); i++) { + if (i == pointerIndex) + concat += "(*) "; concat += rightSide[i]->toString() + " "; } + if (pointerIndex >= rightSide.size()) + concat += "(*)"; return(concat); }