anchor.diff:      |   funcCall                                    # funcCallExpr
       |   atom                                        # atomExpr
       |   variable                                    # varExpr
  -    |   { NotifyErrorListeners("Invalid expression"); } . # errorExpr
       ;
   
   expressionList
  
positive.code: 
  newCollection
      :   '[' expressionList? ']'     # newArray
      |   LBRACE keyValueList? RBRACE  # newDict
      // array errors:
      |   '[' expressionList? ']' { NotifyErrorListeners("Too many brackets"); } ']' # newArrayError
      |   '[' expressionList?     { NotifyErrorListeners("Missing closing ']'"); }   # newArrayError
  
negative.code:     :   '{%' 'endif' '%}'
      ;
  
  expr
      :   <assoc=right> left=expr '^' right=expr      # powExpr
      |   op=('-'|'!') expr                           # unaryExpr 
      |   left=expr op=('*' | '/' | '%') right=expr   # mulDivModExpr
      |   left=expr op=('+'|'-') right=expr           # addSubExpr
      |   left=expr op=('<'|'>'|'<='|'>=') right=expr # relationalExpr
  