diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e541be..428dccd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.21) -project(sparql-parser-base VERSION 0.3.4) +project(sparql-parser-base VERSION 0.3.5) include(cmake/boilerplate_init.cmake) boilerplate_init() @@ -32,19 +32,10 @@ include(${CMAKE_CURRENT_BINARY_DIR}/antlr4cmake/antlr4-generator.cmake) message("antlr4-runtime_DIR ${antlr4-runtime_DIR}") - -file(CREATE_LINK ${CMAKE_CURRENT_SOURCE_DIR}/SparqlLexer.g4 - ${CMAKE_CURRENT_BINARY_DIR}/SparqlLexer.g4 -) -file(CREATE_LINK ${CMAKE_CURRENT_SOURCE_DIR}/SparqlParser.g4 - ${CMAKE_CURRENT_BINARY_DIR}/SparqlParser.g4 -) - - message("Generating SPARQL 1.1 Parser") antlr4_generate( SparqlLexer - "${CMAKE_CURRENT_BINARY_DIR}/SparqlLexer.g4" + "${CMAKE_CURRENT_SOURCE_DIR}/SparqlLexer.g4" LEXER FALSE # don't generate listener for lexer (not possible) FALSE # don't generate visitor for lexer (not possible) @@ -56,7 +47,7 @@ file(CREATE_LINK ${ANTLR4_GENERATED_SRC_DIR}/SparqlLexer/SparqlLexer.interp ${CMAKE_CURRENT_BINARY_DIR}/SparqlLexer.interp) antlr4_generate( SparqlParser - "${CMAKE_CURRENT_BINARY_DIR}/SparqlParser.g4" + "${CMAKE_CURRENT_SOURCE_DIR}/SparqlParser.g4" PARSER TRUE # generate listener TRUE # generate visitor diff --git a/README.md b/README.md index 76dad94..35ed34a 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ To use sparql-parser-base, add it to your `conanfile.txt`: ``` [requires] -sparql-parser-base/0.3.4 +sparql-parser-base/0.3.5 ``` ### With FetchContent @@ -38,7 +38,7 @@ include(FetchContent) FetchContent_Declare( sparql-parser-base GIT_REPOSITORY "${CMAKE_CURRENT_SOURCE_DIR}/../" - GIT_TAG 0.3.4 + GIT_TAG 0.3.5 GIT_SHALLOW TRUE ) FetchContent_MakeAvailable(sparql-parser-base) diff --git a/SparqlLexer.g4 b/SparqlLexer.g4 index c93acf8..3c70962 100644 --- a/SparqlLexer.g4 +++ b/SparqlLexer.g4 @@ -26,6 +26,8 @@ lexer grammar SparqlLexer; WS : (' '| '\t'| EOL)+ -> channel(99); +Q_HINT_VAR_ORD: ('Q'|'q')'_'('H'|'h')('I'|'i')('N'|'n')('T'|'t')'_'('V'|'v')('A'|'a')('R'|'r')'_'('O'|'o')('R'|'r')('D'|'d'); + BASE : ('B'|'b')('A'|'a')('S'|'s')('E'|'e'); PREFIX : ('P'|'p')('R'|'r')('E'|'e')('F'|'f')('I'|'i')('X'|'x'); diff --git a/SparqlParser.g4 b/SparqlParser.g4 index dbc9537..639b28b 100644 --- a/SparqlParser.g4 +++ b/SparqlParser.g4 @@ -55,7 +55,7 @@ subSelect ; selectClause - : SELECT selectModifier? (selectVariables+ | '*') + : hintsClause SELECT selectModifier? (selectVariables+ | '*') ; selectModifier @@ -68,7 +68,7 @@ selectVariables ; constructQuery - : CONSTRUCT (constructTemplate datasetClause* whereClause solutionModifier | datasetClause* WHERE '{' triplesTemplate? '}' solutionModifier) + : hintsClause CONSTRUCT (constructTemplate datasetClause* whereClause solutionModifier | datasetClause* WHERE '{' triplesTemplate? '}' solutionModifier) ; describeQuery @@ -76,7 +76,21 @@ describeQuery ; askQuery - : ASK datasetClause* whereClause solutionModifier + : hintsClause ASK datasetClause* whereClause solutionModifier + ; + +// NOT PART OF THE OFFICIAL GRAMMAR (tentris specific) +hintsClause + : variableOrdering? + ; + +// NOT PART OF THE OFFICIAL GRAMMAR (tentris specific) +variableOrdering + : Q_HINT_VAR_ORD varOrBlankNode+ + ; + +varOrBlankNode + : var | blankNode ; datasetClause