diff --git a/src/parse.cpp b/src/parse.cpp index 4cfab77..262536b 100644 --- a/src/parse.cpp +++ b/src/parse.cpp @@ -53,7 +53,7 @@ std::vector LoadAll(std::istream& input) { Parser parser(input); while (true) { NodeBuilder builder; - if (!parser.HandleNextDocument(builder) || builder.Root().IsNull()) { + if (!parser.HandleNextDocument(builder)) { break; } docs.push_back(builder.Root()); diff --git a/src/parser.cpp b/src/parser.cpp index 04e1946..761ffd5 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -33,9 +33,24 @@ bool Parser::HandleNextDocument(EventHandler& eventHandler) { return false; } + auto oldPos = m_pScanner->peek().mark.pos; + SingleDocParser sdp(*m_pScanner, *m_pDirectives); sdp.HandleDocument(eventHandler); - return true; + + // checks if progress was made + // 1. if scanner has no more tokens, progress was made + if (m_pScanner->empty()) { + return true; + } + + // 2. if token position has changed, progress was made + auto newPos = m_pScanner->peek().mark.pos; + if (newPos != oldPos) { + return true; + } + // No progress was made, no further processing + return false; } void Parser::ParseDirectives() {