package net.enilink.komma.parser.sparql; import org.parboiled.Rule; import org.parboiled.support.Var; import net.enilink.komma.parser.sparql.tree.Graph; import net.enilink.komma.parser.sparql.tree.GraphPattern; import net.enilink.komma.parser.sparql.tree.MinusGraph; import net.enilink.komma.parser.sparql.tree.expr.GraphPatternExpr; /** * SPARQL 1.1 Parser (incomplete) * * <p> * implemented features: * </p> * <ul> * <li>FILTER EXISTS + FILTER NOT EXISTS</li> * <li>MINUS</li> * </ul> */ public class Sparql11Parser extends SparqlParser { @Override public Rule BuiltInCall() { Var<Boolean> not = new Var<>(false); return firstOf( sequence(optional("NOT", not.set(true)), "EXISTS", GroupGraphPattern(), // push(new GraphPatternExpr( not.get() ? GraphPatternExpr.Type.NOT_EXISTS : GraphPatternExpr.Type.EXISTS, (GraphPattern) pop())) // ), // super.BuiltInCall()); } public Rule GraphPatternNotTriples() { return firstOf(OptionalGraphPattern(), MinusGraphPattern(), GroupOrUnionGraphPattern(), GraphGraphPattern()); } public Rule MinusGraphPattern() { return sequence("MINUS", GroupGraphPattern(), push(new MinusGraph( (Graph) pop()))); } }