Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Parsing of SparqlExpressions. #508

Merged
merged 9 commits into from
Nov 3, 2021
84 changes: 84 additions & 0 deletions src/parser/SparqlParserHelpers.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
//
// Created by johannes on 16.05.21.
//

#include "SparqlParserHelpers.h"

#include "sparqlParser/SparqlQleverVisitor.h"
#include "sparqlParser/generated/SparqlAutomaticLexer.h"

namespace sparqlParserHelpers {
using std::string;

struct ParserAndVisitor {
private:
string input;
antlr4::ANTLRInputStream stream{input};
SparqlAutomaticLexer lexer{&stream};
antlr4::CommonTokenStream tokens{&lexer};

public:
SparqlAutomaticParser parser{&tokens};
SparqlQleverVisitor visitor;
explicit ParserAndVisitor(string toParse) : input{std::move(toParse)} {}
explicit ParserAndVisitor(string toParse,
SparqlQleverVisitor::PrefixMap prefixMap)
: input{std::move(toParse)}, visitor{std::move(prefixMap)} {}

template <typename ResultType, typename ContextType>
auto parseStuff(const std::string& input,
ContextType* (SparqlAutomaticParser::*F)(void))

{
auto context = (parser.*F)();
auto remainingString =
input.substr(parser.getCurrentToken()->getStartIndex());
auto result =
std::move(context->accept(&(visitor)).template as<ResultType>());
return ParseResultAndRemainingText{std::move(result),
std::move(remainingString)};
}
};

ParseResultAndRemainingText<sparqlExpression::SparqlExpressionPimpl>
parseExpression(const std::string& input) {
ParserAndVisitor p{input};
auto actualResult = p.parseStuff<sparqlExpression::SparqlExpression::Ptr>(
input, &SparqlAutomaticParser::expression);

return ParseResultAndRemainingText{sparqlExpression::SparqlExpressionPimpl{
std::move(actualResult._parseResult)},
std::move(actualResult._remainingText)};
}

ParseResultAndRemainingText<ParsedQuery::Alias> parseAlias(
const std::string& input) {
ParserAndVisitor p{input};
auto actualResult = p.parseStuff<ParsedQuery::Alias>(
input, &SparqlAutomaticParser::aliasWithouBrackes);
return actualResult;
}

// ______________________________________________________________________________
std::pair<SparqlQleverVisitor::PrefixMap, size_t> parsePrologue(
const string& input) {
ParserAndVisitor p{input};
auto context = p.parser.prologue();
auto parsedSize = context->getText().size();
p.visitor.visitPrologue(context);
const auto& constVisitor = p.visitor;
return {constVisitor.prefixMap(), parsedSize};
}

// _____________________________________________________________________________
std::pair<string, size_t> parseIri(const string& input,
SparqlQleverVisitor::PrefixMap prefixMap) {
ParserAndVisitor p{input, std::move(prefixMap)};
auto context = p.parser.iri();
auto parsedSize = context->getText().size();
auto resultString = p.visitor.visitIri(context).as<string>();
// const auto& constVisitor = p.visitor;
return {std::move(resultString), parsedSize};
}

} // namespace sparqlParserHelpers
33 changes: 33 additions & 0 deletions src/parser/SparqlParserHelpers.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
//
// Created by johannes on 16.05.21.
//

#ifndef QLEVER_SPARQLPARSERHELPERS_H
#define QLEVER_SPARQLPARSERHELPERS_H

#include <memory>
#include <string>

#include "../engine/sparqlExpressions/SparqlExpressionPimpl.h"
#include "./ParsedQuery.h"

namespace sparqlParserHelpers {

template <typename ParseResult>
struct ParseResultAndRemainingText {
ParseResultAndRemainingText(ParseResult&& parseResult,
std::string&& remainingText)
: _parseResult{std::move(parseResult)},
_remainingText{std::move(remainingText)} {}
ParseResult _parseResult;
std::string _remainingText;
};

ParseResultAndRemainingText<sparqlExpression::SparqlExpressionPimpl>
parseExpression(const std::string& input);

ParseResultAndRemainingText<ParsedQuery::Alias> parseAlias(
const std::string& input);
} // namespace sparqlParserHelpers

#endif // QLEVER_SPARQLPARSERHELPERS_H
2 changes: 1 addition & 1 deletion src/parser/sparqlParser/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ add_library(sparqlParser SparqlQleverVisitor.h SparqlQleverVisitor.cpp
generated/SparqlAutomaticListener.h generated/SparqlAutomaticListener.cpp
generated/SparqlAutomaticParser.h generated/SparqlAutomaticParser.cpp
generated/SparqlAutomaticVisitor.h generated/SparqlAutomaticVisitor.cpp)
target_link_libraries(sparqlParser antlr4_static rdfEscaping absl::flat_hash_map)
target_link_libraries(sparqlParser antlr4_static sparqlExpressions rdfEscaping absl::flat_hash_map)