anchor.diff:      ;
   
   valueArguments
  -    : LPAREN valueArgument? RPAREN
  -    | LPAREN valueArgument (COMMA valueArgument)* RPAREN
  +    : LPAREN (valueArgument (COMMA valueArgument)*)? RPAREN
       ;
   
   typeArguments
  
positive.code:     ;
  
  multiplicativeExpression
      : asExpression (multiplicativeOperator NL* asExpression)*
      ;
  
  asExpression
      : prefixUnaryExpression asExpressionTail?
      ;
  
  asExpressionTail
      : NL* asOperator NL* type asExpressionTail?
      ;
  
  prefixUnaryExpression
      : prefixUnaryOperator* postfixUnaryExpression
      | annotations* postfixUnaryExpression
      ;
  
  postfixUnaryExpression
      : assignableExpression
      | callExpression
      | labeledExpression
      | dotQualifiedExpression
      | assignableExpression postfixUnaryOperator*
      | LPAREN callableReference RPAREN postfixUnaryOperator+
      | callableReference
      ;
  
  callExpression
      : assignableExpression typeArguments? valueArguments? annotatedLambda*
      ;
  
  labeledExpression
      : labelDefinition postfixUnaryExpression
      ;
  
  dotQualifiedExpression
      : assignableExpression (NL* memberAccessOperator postfixUnaryExpression)+
      ;
  
  assignableExpression
      : primaryExpression
      | indexingExpression
      ;
  
  indexingExpression
      : identifier arrayAccess+
      ;
  
  callSuffix
  
negative.code: options { tokenVocab = KotlinLexer; }
  
  kotlinFile
      : NL* preamble topLevelObject* EOF
      ;
  
  script
      : NL* preamble expression* EOF
      ;
  
  preamble
      : fileAnnotations? packageHeader importList
      ;
  
  fileAnnotations
      : fileAnnotation+
      ;
  
  fileAnnotation
  