diff --git a/annis-service/src/main/antlr4/annis/ql/AqlParser.g4 b/annis-service/src/main/antlr4/annis/ql/AqlParser.g4 index 12d2c42e15..8a0c67856f 100644 --- a/annis-service/src/main/antlr4/annis/ql/AqlParser.g4 +++ b/annis-service/src/main/antlr4/annis/ql/AqlParser.g4 @@ -110,6 +110,7 @@ notequalvalue : NEQ ; + operator : precedence | near @@ -119,13 +120,17 @@ operator | commonparent | commonancestor | identity - | equalvalue - | notequalvalue ; +/* Addtional operators that are do not bind two variables. */ +nonbinding_operator + : equalvalue + | notequalvalue + ; n_ary_linguistic_term - : refOrNode (operator refOrNode)+ # Relation + : refOrNode (operator refOrNode)+ # BindingRelation + | REF (nonbinding_operator REF)+ # NonBindingRelation ; diff --git a/annis-service/src/main/java/annis/ql/parser/JoinListener.java b/annis-service/src/main/java/annis/ql/parser/JoinListener.java index f77214493a..a5a6895f79 100644 --- a/annis-service/src/main/java/annis/ql/parser/JoinListener.java +++ b/annis-service/src/main/java/annis/ql/parser/JoinListener.java @@ -124,9 +124,8 @@ public void exitOperator(AqlParser.OperatorContext ctx) relationIdx++; } - @Override - public void enterRelation(AqlParser.RelationContext ctx) + public void enterBindingRelation(AqlParser.BindingRelationContext ctx) { int numOfReferences = ctx.refOrNode().size(); relationIdx = 0; @@ -145,6 +144,27 @@ public void enterRelation(AqlParser.RelationContext ctx) relationChain.add(i, n); } } + + @Override + public void enterNonBindingRelation(AqlParser.NonBindingRelationContext ctx) + { + int numOfReferences = ctx.REF().size(); + relationIdx = 0; + relationChain.clear(); + relationChain.ensureCapacity(numOfReferences); + + for(int i=0; i < numOfReferences; i++) + { + QueryNode n = nodeByRef(ctx.REF(i).getSymbol()); + if(n == null) + { + throw new AnnisQLSemanticsException( + AnnisParserAntlr.getLocation(ctx.getStart(), ctx.getStop()), + "invalid reference to '" + ctx.REF(i).getText() + "'"); + } + relationChain.add(i, n); + } + } @Override public void enterRootTerm(AqlParser.RootTermContext ctx) diff --git a/annis-service/src/test/java/annis/ql/parser/TestAnnisParser-examples.xml b/annis-service/src/test/java/annis/ql/parser/TestAnnisParser-examples.xml index cbf2c42d2a..6c1f0a4e64 100644 --- a/annis-service/src/test/java/annis/ql/parser/TestAnnisParser-examples.xml +++ b/annis-service/src/test/java/annis/ql/parser/TestAnnisParser-examples.xml @@ -87,7 +87,8 @@ - + +