diff options
Diffstat (limited to 'src/core/parser')
-rw-r--r-- | src/core/parser/stack/Handler.cpp | 17 | ||||
-rw-r--r-- | src/core/parser/stack/Handler.hpp | 5 |
2 files changed, 19 insertions, 3 deletions
diff --git a/src/core/parser/stack/Handler.cpp b/src/core/parser/stack/Handler.cpp index 0a6e67c..1399fef 100644 --- a/src/core/parser/stack/Handler.cpp +++ b/src/core/parser/stack/Handler.cpp @@ -16,6 +16,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <cassert> + #include <core/common/Exceptions.hpp> #include <core/common/Logger.hpp> #include <core/common/Variant.hpp> @@ -41,11 +43,15 @@ HandlerData::HandlerData(ParserContext &ctx, HandlerCallbacks &callbacks, /* Class Handler */ Handler::Handler(const HandlerData &handlerData) - : handlerData(handlerData), internalLogger(nullptr) + : handlerData(handlerData), internalLogger(nullptr), tokenStackDepth(0) { } -Handler::~Handler() {} +Handler::~Handler() { + while (tokenStackDepth > 0) { + popTokens(); + } +} ParserContext &Handler::context() { return handlerData.ctx; } @@ -80,10 +86,15 @@ Variant Handler::readData() { return handlerData.callbacks.readData(); } void Handler::pushTokens(const std::vector<SyntaxDescriptor> &tokens) { + tokenStackDepth++; handlerData.callbacks.pushTokens(tokens); } -void Handler::popTokens() { handlerData.callbacks.popTokens(); } +void Handler::popTokens() { + assert(tokenStackDepth > 0 && "popTokens called too often"); + tokenStackDepth--; + handlerData.callbacks.popTokens(); +} TokenId Handler::registerToken(const std::string &token) { diff --git a/src/core/parser/stack/Handler.hpp b/src/core/parser/stack/Handler.hpp index d85848a..17c91d8 100644 --- a/src/core/parser/stack/Handler.hpp +++ b/src/core/parser/stack/Handler.hpp @@ -128,6 +128,11 @@ private: */ Logger *internalLogger; + /** + * Current size of the internal "token" stack. + */ + size_t tokenStackDepth; + protected: /** * Constructor of the Handler class. |