diff --git a/lib/spargebra/src/parser.rs b/lib/spargebra/src/parser.rs index d5120ac1..3f652564 100644 --- a/lib/spargebra/src/parser.rs +++ b/lib/spargebra/src/parser.rs @@ -1694,11 +1694,19 @@ parser! { rule PathSequence_item() -> PropertyPathExpression = p:PathEltOrInverse() _ { p } //[91] - rule PathElt() -> PropertyPathExpression = - p:PathPrimary() "?" { PropertyPathExpression::ZeroOrOne(Box::new(p)) } / //TODO: allow space before "?" - p:PathPrimary() _ "*" { PropertyPathExpression::ZeroOrMore(Box::new(p)) } / - p:PathPrimary() _ "+" { PropertyPathExpression::OneOrMore(Box::new(p)) } / - PathPrimary() + rule PathElt() -> PropertyPathExpression = p:PathPrimary() _ o:PathElt_op()? { + match o { + Some('?') => PropertyPathExpression::ZeroOrOne(Box::new(p)), + Some('*') => PropertyPathExpression::ZeroOrMore(Box::new(p)), + Some('+') => PropertyPathExpression::OneOrMore(Box::new(p)), + Some(_) => unreachable!(), + None => p + } + } + rule PathElt_op() -> char = + "*" { '*' } / + "+" { '+' } / + "?" !(['0'..='9'] / PN_CHARS_U()) { '?' } // We mandate that this is not a variable //[92] rule PathEltOrInverse() -> PropertyPathExpression = diff --git a/testsuite/oxigraph-tests/sparql/manifest.ttl b/testsuite/oxigraph-tests/sparql/manifest.ttl index 7a2d5869..bb6fcc1b 100644 --- a/testsuite/oxigraph-tests/sparql/manifest.ttl +++ b/testsuite/oxigraph-tests/sparql/manifest.ttl @@ -23,6 +23,8 @@ :subquery_in_filter_not_exists :cmp_langString :update_dirtyRead + :nested_path + :nested_expression ) . :small_unicode_escape_with_multibytes_char rdf:type mf:NegativeSyntaxTest ; @@ -98,3 +100,11 @@ mf:name "An update operation should not be able to read its own writes" ; mf:action [ ut:request ] ; mf:result [ ut:data ] . + +:nested_path rdf:type mf:PositiveSyntaxTest11 ; + mf:name "A very nested property path" ; + mf:action . + +:nested_expression rdf:type mf:PositiveSyntaxTest11 ; + mf:name "A very nested expression" ; + mf:action . diff --git a/testsuite/oxigraph-tests/sparql/nested_expression.rq b/testsuite/oxigraph-tests/sparql/nested_expression.rq new file mode 100644 index 00000000..374e3967 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql/nested_expression.rq @@ -0,0 +1,4 @@ +SELECT * WHERE { + ?s ?p ?o . + FILTER((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((true)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) +} diff --git a/testsuite/oxigraph-tests/sparql/nested_path.rq b/testsuite/oxigraph-tests/sparql/nested_path.rq new file mode 100644 index 00000000..e0c2127c --- /dev/null +++ b/testsuite/oxigraph-tests/sparql/nested_path.rq @@ -0,0 +1,3 @@ +SELECT * WHERE { + ?s (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ?o +}