From 55ef48c78ed1e25f83d368aa4815f750cbc013e2 Mon Sep 17 00:00:00 2001 From: Mislav Bradac Date: Wed, 12 Apr 2017 15:31:07 +0200 Subject: [PATCH] Add antlr error description to SyntaxException Reviewers: teon.banek Reviewed By: teon.banek Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D269 --- src/query/frontend/opencypher/parser.hpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/query/frontend/opencypher/parser.hpp b/src/query/frontend/opencypher/parser.hpp index 919964202..d077c20bb 100644 --- a/src/query/frontend/opencypher/parser.hpp +++ b/src/query/frontend/opencypher/parser.hpp @@ -26,23 +26,38 @@ class Parser { */ Parser(const std::string query) : query_(std::move(query)) { parser_.removeErrorListeners(); + parser_.addErrorListener(&error_listener_); tree_ = parser_.cypher(); if (parser_.getNumberOfSyntaxErrors()) { - throw query::SyntaxException(); + throw query::SyntaxException(error_listener_.error_); } } auto tree() { return tree_; } private: + class FirstMessageErrorListener : public antlr4::BaseErrorListener { + void syntaxError(IRecognizer *, Token *, size_t line, size_t position, + const std::string &message, std::exception_ptr) override { + if (error_.empty()) { + error_ = "line " + std::to_string(line) + ":" + + std::to_string(position) + " " + message; + } + } + + public: + std::string error_; + }; + + FirstMessageErrorListener error_listener_; std::string query_; ANTLRInputStream input_{query_.c_str()}; CypherLexer lexer_{&input_}; CommonTokenStream tokens_{&lexer_}; // generate ast -CypherParser parser_{&tokens_}; -tree::ParseTree *tree_ = nullptr; + CypherParser parser_{&tokens_}; + tree::ParseTree *tree_ = nullptr; }; } }