anchor.diff:    
   constructQuery
       : ^(CONSTRUCT (c=constructTemplate)? (d+=datasetClause)* (w=whereClause)? s=solutionModifier) -> constructQuery(constructTemplate={$c.st}, datasetClause={$d}, whereClause={$w.st}, solutionModifier={$s.st})
  -    | ^(CONSTRUCT (d+=datasetClause)* ^(WHERE (t+=triplesTemplate)*) solutionModifier) -> constructQuery(datasetClause={$d}, triplesTemplate={$t}, solutionModifier={$s.st})
  +    | ^(CONSTRUCT (d+=datasetClause)* ^(WHERE (g+=groupGraphPattern)*) solutionModifier) -> constructQuery(datasetClause={$d}, groupGraphPattern={$g}, solutionModifier={$s.st})
       ;
   
   describeQuery
  
positive.code:     ;
      		 
  groupCondition
      : b=builtInCall -> groupCondition(builtInCall={$b.st})
      | f=functionCall -> groupCondition(functionCall={$f.st})
      | ^(AS e=expression (v+=var)*) -> groupCondition(expression={$e.st}, var={$v})
      | var -> groupCondition(var={$var.st})
      ;
  
  havingClause
  
negative.code:     | ^(IRI e=expression) -> builtInCall(type={$IRI.text}, expression={$e.st})
      | ^(URI e=expression) -> builtInCall(type={$URI.text}, expression={$e.st})
      | ^(BNODE e=expression) -> builtInCall(type={$BNODE.text}, expression={$e.st})
      | BNODE -> builtInCall(type={$BNODE.text})
      | RAND -> builtInCall(type={$RAND.text})
      | ^(ABS e=expression) -> builtInCall(type={$ABS.text}, expression={$e.st})
      | ^(CEIL e=expression) -> builtInCall(type={$CEIL.text}, expression={$e.st})
  