enhance and better document PopReader()

This commit is contained in:
Dick Hollenbeck 2010-10-05 08:38:15 -05:00
parent 9f4e57d428
commit 3213832411
2 changed files with 30 additions and 10 deletions

View File

@ -57,9 +57,6 @@ void DSNLEXER::init()
space_in_quoted_tokens = true; space_in_quoted_tokens = true;
commentsAreTokens = false; commentsAreTokens = false;
limit = start;
next = start;
} }
@ -90,15 +87,28 @@ void DSNLEXER::PushReader( LINE_READER* aLineReader )
readerStack.push_back( aLineReader ); readerStack.push_back( aLineReader );
reader = aLineReader; reader = aLineReader;
start = (char*) (*aLineReader); start = (char*) (*aLineReader);
// force a new readLine() as first thing.
limit = start;
next = start;
} }
void DSNLEXER::PopReader() bool DSNLEXER::PopReader()
{ {
readerStack.pop_back(); // the very last reader cannot be popped, for that would screw up limit and next.
reader = &readerStack.back(); if( readerStack.size() >= 2 )
if( reader ) {
readerStack.pop_back();
reader = &readerStack.back();
start = (char*) (*reader); start = (char*) (*reader);
// force a new readLine() as first thing.
limit = start;
next = start;
}
} }

View File

@ -172,8 +172,12 @@ public:
/** /**
* Function PushReader * Function PushReader
* manages a stack of LINE_READERs in order to handle nested file inclusion. * manages a stack of LINE_READERs in order to handle nested file inclusion.
* Pushes aLineReader onto the top of a stack of LINE_READERs and makes * This function pushes aLineReader onto the top of a stack of LINE_READERs and makes
* it the current LINE_READER with its own GetSource(), line number and line text. * it the current LINE_READER with its own GetSource(), line number and line text.
* A grammar must be designed such that the "include" token (whatever its various names),
* and any of its parameters are not followed by anything on that same line,
* because PopReader always starts reading from a new line upon returning to
* the original LINE_READER.
*/ */
void PushReader( LINE_READER* aLineReader ); void PushReader( LINE_READER* aLineReader );
@ -183,9 +187,15 @@ public:
* in the case of FILE_LINE_READER this means the associated FILE is closed. * in the case of FILE_LINE_READER this means the associated FILE is closed.
* The most recently used former LINE_READER on the stack becomes the * The most recently used former LINE_READER on the stack becomes the
* current LINE_READER and its previous position in its input stream and the * current LINE_READER and its previous position in its input stream and the
* its latest line number should pertain. * its latest line number should pertain. PopReader always starts reading
* from a new line upon returning to the previous LINE_READER. A pop is only
* possible if there are at least 2 LINE_READERs on the stack, since popping
* the last one is not supported.
*
* @return bool - true if there was at least two readers on the stack and
* therefore the pop succeeded, else false and the pop failed.
*/ */
void PopReader(); bool PopReader();
// Some functions whose return value is best overloaded to return an enum // Some functions whose return value is best overloaded to return an enum
// in a derived class. // in a derived class.