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 @@
-
+
+