summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/parser/stack/Handler.cpp17
-rw-r--r--src/core/parser/stack/Handler.hpp5
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.